C Plus Plus Env Prepare

本文详细介绍了在 Linux 系统上为 MongoDB C++ Driver 准备依赖库及编译步骤,包括 gcc、glibc、cppcms、cppdb、boost 和 mongo-cxx-driver 的编译配置。

这里写图片描述
图片中有个地方错了,编译mongodb driver, 必须使用系统自带的boost

编译主要分为如下,下面的所有组件都是直接并行编译,彼此之间不受影响
gcc
glibc
cppcms
cppdb
boost
mongo driver

gcc

# gcc 

# yum install -y gcc-gnat

cd /usr/local/src 
rm -rvf gcc-4.9.1 && mkdir gcc-4.9.1 && cd gcc-4.9.1 && rsync -avzP bigdata.vxlan.net::d/ide/gcc-4.9.1.tar.gz .
tar xzvf gcc-4.9.1.tar.gz
#./contrib/download_prerequisites
## using the following without a prefix, it will install on /usr/local/lib64
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/data/c++/gcc/ --build=x86_64-redhat-linux --enable-threads=posix

# export CFLAGS="-g -O2 -fPIC"                                                                             

make -j20
make install

newBinPATH=/data/c++/gcc/bin
newIncludePATH=/data/c++/gcc/include
newLibPATH=/data/c++/gcc/lib64

# 方式二
export PATH=$newBinPATH:$PATH
export INCLUDE_PATH=$newIncludePATH:$INCLUDE_PATH
export LIBRARY_PATH=$newLibPATH:$LIBRARY_PATH
export CPLUS_INCLUDE_PATH=$newIncludePATH:$CPLUS_INCLUDE_PATH
export CPLUS_LIBRARY_PATH=$newLibPATH:$CPLUS_LIBRARY_PATH

glibc

rm -rvf /usr/local/src/glibc*
rm -rvf /usr/lcoal/test/glibc*
rm -rvf /usr/local/src/glibc-build*

cd /usr/local/src && rsync -avzP bigdata.vxlan.net::d/ide/glibc-2.14.tar.gz .         

tar xzvf glibc-2.14.tar.gz                                                                              
mkdir glibc-build && cd glibc-build                                                                      

export CFLAGS="-g -O2 -fPIC"                                                                             

../glibc-2.14/configure --prefix=/data/c++/glibc/ --enable-add-ons
make -j20                                                                           
make install  

boost

# http://www.neuraladvance.com/compiling-boost-on-linux.html                                                                                            

# 清场
rm -rvf /usr/local/src/boost*
rm -rvf /data/c++/boost*

# 下载编译安装
cd /usr/local/src && rsync -avzP bigdata.vxlan.net::d/ide/boost_1_55_0.tar.bz2 .                         

tar jxf boost_1_55_0.tar.bz2                                                                            

cd boost_1_55_0

#./bootstrap.sh --with-icu --prefix=/data/c++/boost/
./bootstrap.sh --prefix=/data/c++/boost/
./b2 -j 24
./b2 install 

# include file
rsync -avzP /data/c++/boost/include/boost /usr/include/

# 后期处理
rsync -avzP /data/c++/boost/include/* /usr/include/
rsync -avzP /data/c++/boost/lib/* /usr/local/lib/

cppcms 1.0.4

export http_proxy="http://XXXX:3128"

# cppCMS                                                                                                 
# apt-get install cmake       
# yum install cmake                                                                             

# 清场
rm -rvf /usr/local/src/cppcms*
rm -rvf /data/c++/cppcms*

# 下载编译安装
cd /usr/local/src                                                                     
rsync -avzP bigdata.vxlan.net::d/ide/cppcms-1.0.4.tar.bz2 .                                              
tar jxvf cppcms-1.0.4.tar.bz2                                                                            
cd cppcms-1.0.4                                                                                          
mkdir build && cd build                                                                                  

cmake -DCMAKE_INSTALL_PREFIX=/data/c++/cppcms ..
make -j 24                                                                                                    
make install                                                                                             

# include file
rm -rf /usr/include/cppcms
rm -rf /usr/include/booster
rsync -avzP /data/c++/cppcms/include/* /usr/include/
# rsync -avzP /data/c++/cppcms/lib/* /usr/local/lib/
# rsync -avzP /data/c++/cppcms/bin/* /bin/

export PATH=/data/c++/cppcms/bin/:$PATH

mongodriver

# mongoclient
# mongoclient C++                                                                                        
# git clone https://github.com/mongodb/mongo-cxx-driver.git                                              
# https://github.com/mongodb/mongo-cxx-driver/wiki/Download%20and%20Compile                              
# http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

# apt-get install scons -y                                                                                 
# yum install scons

# 清场
rm -rvf /usr/local/src/mongo*
rm -rvf /data/c++/mongo*

# 下载编译安装
cd /usr/local/src                                                                                        
rsync -avzP bigdata.vxlan.net::d/ide/mongo-cxx-driver .                                                  
cd mongo-cxx-driver                                                                                      
git checkout 26compat                                                                                    

# 

# export LIBRARY_PATH=/data/c++/boost/lib/
scons --use-system-boost --sharedclient --full install-mongoclient --libpath=/data/c++/boost/lib/ --cpppath=/data/c++/boost/include/ --prefix=/data/c++/mongoclientc++/ -j 20

# scons --use-system-boost --sharedclient --full install-mongoclient  --prefix=/data/c++/mongoclientc++/ -j 20

# include file
rsync -avzP /data/c++/mongoclientc++/include/mongo /usr/include/

/data/c++/cppcms/lib
/data/c++/boost/lib
/data/c++/mongoclientc++/lib


scons --prefix=/data/c++/ --use-system-boost --sharedclient --full install-mongoclient -j 24

# 后期处理
# rsync -avzP /data/c++/mongoclientc++/include/* /usr/include/
# rsync -avzP /data/c++/mongoclientc++/lib/* /usr/local/lib/

ldconfig

cppdb

# cppdb

rm -rf /usr/local/src/cppdb-trunk
cd /usr/local/src
rsync -avzP bigdata.vxlan.net::d/cppdb/cppdb-trunk .

cd cppdb-trunk
mkdir build
cd build

cmake -DCMAKE_INSTALL_PREFIX=/data/c++/cppdb ..
make -j 20

make install

# include file
rsync -avzP /data/c++/cppdb/include/cppdb /usr/include/

ldconfig

# 
cd /data
mkdir c++
cd c++ && rsync -avzP bigdata.vxlan.net::d/c++/c++.20150908.tar.gz .
tar xzvf c++.20150908.tar.gz
# /etc/ld.so.conf.d/XX.conf
echo '
/data/c++/boost/lib
/data/c++/mongoclientc++/lib
/data/c++/cppdb/lib
/data/c++/glibc/lib
/data/c++/gcc/lib64
' > /etc/ld.so.conf.d/bigdata.conf

# ldconfig
# ldconfig -p | grep cppcms

总结

# 程序运行
export PATH=/data/c++/cppcms/bin:/data/c++/gcc/bin:$PATH

# 编译的时候用到
export LIBRARY_PATH=/data/c++/gcc/lib64:/data/c++/cppcms/lib:/data/c++/mongoclientc++/lib:/data/c++/boost/lib:/data/c++/cppdb/lib:/data/c++/mine/lib/:/data/c++/glibc/lib

# 运行的时候用到
export LD_LIBRARY_PATH=/data/c++/gcc/lib64:/data/c++/cppcms/lib:/data/c++/mongoclientc++/lib:/data/c++/boost/lib:/data/c++/cppdb/lib:/data/c++/mine/lib/:/data/c++/glibc/lib

# cppcms用gcc 4.4.7 或者 4.9.1 貌似都不所谓
(rag_env) C:\Users\Lenovo\rag_scrapydb\src>python test_vectorstore.py Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████| 7/7 [01:47<00:00, 15.29s/it] Traceback (most recent call last): File "C:\Users\Lenovo\rag_scrapydb\src\test_vectorstore.py", line 24, in <module> response = chat(user_input) File "C:\Users\Lenovo\rag_scrapydb\src\test_vectorstore.py", line 17, in chat inputs = tokenizer(query, return_tensors="pt").to(model.device) File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils_base.py", line 2855, in __call__ encodings = self._call_one(text=text, text_pair=text_pair, **all_kwargs) File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils_base.py", line 2965, in _call_one return self.encode_plus( File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils_base.py", line 3040, in encode_plus return self._encode_plus( File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils.py", line 803, in _encode_plus return self.prepare_for_model( File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils_base.py", line 3540, in prepare_for_model encoded_inputs = self.pad( File "D:\annaCONDA\envs\rag_env\lib\site-packages\transformers\tokenization_utils_base.py", line 3338, in pad encoded_inputs = self._pad( TypeError: ChatGLMTokenizer._pad() got an unexpected keyword argument 'padding_side'
07-06
你遇到的错误是: ``` TypeError: ChatGLMTokenizer._pad() got an unexpected keyword argument 'padding_side' ``` 这个错误说明:**`ChatGLMTokenizer` 的 `pad()` 方法没有接受 `padding_side` 参数**,但 Transformers 框架试图传入该参数。 --- ## ❓ 为什么会报这个错? 这是因为 **Transformers 版本和 ChatGLM 自定义 Tokenizer 实现不兼容**。 ### 原因分析: - `ChatGLMTokenizer` 是自定义实现的 Tokenizer 类(在 `tokenization_chatglm.py` 中定义) - 它可能 **没有正确覆盖 `_pad()` 方法** 或者没有处理某些新版本 Transformers 引入的新参数(如 `padding_side`) 这通常发生在以下情况: - 使用了较新的 `transformers` 库 - 而 ChatGLM 的 tokenizer 实现仍基于旧版接口 --- ## ✅ 解决方案一:指定填充方式避免调用 pad() 你可以手动禁用自动 padding 并自己处理输入长度: ```python def chat(query): inputs = tokenizer(query, return_tensors="pt", padding=False, truncation=True).to(model.device) outputs = model.generate(**inputs, max_new_tokens=200) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response ``` > 这样就不会触发 `pad()` 函数,绕过这个 bug。 --- ## ✅ 解决方案二:修改 `tokenization_chatglm.py` 中的 `_pad()` 方法 找到你的模型目录下的文件: ``` C:\Users\Lenovo\.cache\modelscope\hub\models\ZhipuAI\chatglm3-6b\tokenization_chatglm.py ``` 打开它,找到 `class ChatGLMTokenizer`,然后修改或添加如下方法: ```python def _pad(self, encoded_inputs, max_length=None, padding_side='right', pad_to_multiple_of=None, return_attention_mask=None): # 确保包含所有参数并实现 padding if return_attention_mask is None: return_attention_mask = True needs_to_be_padded = max_length and len(encoded_inputs["input_ids"]) < max_length if needs_to_be_padded: difference = max_length - len(encoded_inputs["input_ids"]) if padding_side == "right": input_ids = encoded_inputs["input_ids"] + [self.pad_token_id] * difference elif padding_side == "left": input_ids = [self.pad_token_id] * difference + encoded_inputs["input_ids"] else: raise ValueError(f"Invalid padding_side: {padding_side}") attention_mask = encoded_inputs.get("attention_mask", []) if padding_side == "right": attention_mask = attention_mask + [0] * difference elif padding_side == "left": attention_mask = [0] * difference + attention_mask encoded_inputs["input_ids"] = input_ids if return_attention_mask: encoded_inputs["attention_mask"] = attention_mask else: if return_attention_mask: encoded_inputs["attention_mask"] = [1] * len(encoded_inputs["input_ids"]) return encoded_inputs ``` 这样就可以支持 `padding_side` 参数了。 --- ## ✅ 解决方案三:降级 transformers 到兼容版本 如果你不想修改源码,可以尝试降级 transformers: ```bash pip install transformers==4.28.0 ``` 这个版本对 ChatGLM 的支持更稳定,不容易出现接口不兼容的问题。 --- ## 🧠 总结 | 错误 | 原因 | 解决方案 | |------|------|-----------| | TypeError: ChatGLMTokenizer._pad() got an unexpected keyword argument 'padding_side' | Transformers 新版本与 ChatGLM 自定义 Tokenizer 接口不兼容 | 1. 手动禁用 padding<br>2. 修改 `_pad()` 方法支持新参数<br>3. 降级 transformers | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值