先强调下,我是小白,这个只是我尝试的记录,仅供参考
初期的尝试
这部分尝试其实不用看,我只是既然已经做过了,就记录一下
我装的Ubuntu20.04,其实22估计也可以,我装了后发现python版本3.9,pip里面没有wenetruntime包,又换回20了,当时不会conda没经验
装完系统主要就是一些常用的工具装一下,vim、cmake、pip啥的
sudo apt-get -y install git cmake python3-pip vim git
然后关默认的显卡驱动,可以参考这个https://blog.csdn.net/u012229282/article/details/124442555
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
sudo update-initramfs -u
reboot
这一步我感觉也不是很必要,我看nvidia驱动按照过程默认也会执行这操作,但反正我做了
然后去nvidia官网找下驱动https://www.nvidia.cn/Download/index.aspx?lang=cn#
命令直接贴了
wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/525.116.03/NVIDIA-Linux-x86_64-525.116.03.run
sudo apt-get install build-essential
sudo su
sh NVIDIA-Linux-x86_64-525.116.03.run
然后安装cuda和cudnn,这两个东西我感觉吧,如果用pytorch的话,有现成的版本包,貌似根本不需要单独安装,但如果是libtorch C++版本的,那需要版本匹配,当然这个目前我没有严谨验证过,姑且先这么理解
官网下载先 https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local
这里面选择了你系统版本啥的,现在的版本是12了,官网上也提供旧版本下载,但我发现11.x的版本安装都会报错,另外下面这个安装里面其实默认还包含了驱动,有看到网上说只要按照toolkit就行,但也没事,先按照下面的安装就好了,多版本怎么搞下面说明
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda-repo-ubuntu2004-12-1-local_12.1.1-530.30.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-1-local_12.1.1-530.30.02-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
装完要加到环境变量
vim ~/.bashrc 把下面的加上
# cuda 12.1
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:$CUDA_HOME/bin
然后重新连接一次shell,或者在当前shell下手动export一下变量
装完这么验证
/usr/local/cuda-12.1/extras/demo_suite$ ./deviceQuery
Result = PASS
这块的资料乱糟糟,没有理清楚,不过我最后总结下,其实这里安装啥版本没关系,如果需要别的版本的话,官网找到对应版本,直接按上面步骤,最后install的时候tab一下,只要安装toolkit就好
装了多个版本后,只要重新配置软链接就可以切换版本,举个例子,nvcc可以查看版本
#cuda12 切换到 cuda11
sudo rm -rf /etc/alternatives/cuda
sudo ln -s /usr/local/cuda-11.3/ /etc/alternatives/cuda
nvcc --version
#cuda11 切换到 cuda12
sudo rm -rf /etc/alternatives/cuda
sudo ln -s /usr/local/cuda-12.1/ /etc/alternatives/cuda
nvcc --version
# 切到11.7
sudo rm -rf /etc/alternatives/cuda
sudo ln -s /usr/local/cuda-11.7/ /etc/alternatives/cuda
nvcc --version
cudnn安装
下载 https://developer.nvidia.com/rdp/cudnn-download
安装 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
sudo dpkg -i cudnn-local-repo-ubuntu2004-8.9.0.131_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-ubuntu2004-8.9.0.131/cudnn-local-80259EFB-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install libcudnn8=8.9.0.131-1+cuda12.1
sudo apt-get install libcudnn8-dev=8.9.0.131-1+cuda12.1
sudo apt-get install libcudnn8-samples=8.9.0.131-1+cuda12.1
另外补一个包,wenet编译时候会用到
sudo apt-get install libicu-dev
到这里基本环境已经就绪了,可以编译wenet试试了,上面的这些步骤吧,其实可能就驱动安装时必要的,其他貌似也不是很重要,但是反正都做了,记一下多些了解和感受。
wenet初尝试
这东西吧,主要还是我实在是太新手了,刚开始完全没概念,我连推理和训练这两名词都还不太理解,看那Readme更是一头雾水,到底我该做什么才能跑起来,Demo在哪,长啥样?
之前跑了一次直接pip安装wenetruntime包,做了一把wav的识别,但是感受还是很微妙,不知道怎么继续。
先说明一下,这些记录都是基于当前版本的wenet,这东西也是一直在更新的,过段时间可能就不一样了
这次是翻了翻runtime里面有个libtorch的readme,打算做一把这个编译先感受一下。
这个Demo是一个C++的实现,做了Server和Client,在Client读取wav音频文件送到Server解析转文字。
默认编译是CPU版本,可以加启用GPU的选项,默认应该是websocket传输数据,可以加GPRC选项
这个GRPC选项真是大坑,一开始开了这个选项,就会去拉GRPC源码编译,这垃圾玩意一堆子模块,国内的屎网络没办法把子模块全部拉取成功,然后我找了各种方法试图拉取成功,改host、挂代理,全都试过了,完全搞不定,放弃了。所以以下是按照不开启GRPC的搞的。
不考虑GRPC的编译其实很简单,这里也不涉及python,如果想快点还可以自己改下makefile加-j多线程
git clone https://github.com/wenet-e2e/wenet
cd wenet/runtime/libtorch
mkdir build && cd build
cmake -DGPU=ON ..
cmake --build .
正常应该不会出什么意外吧,编译完成后就是下载以下预训练好的模型,这个东西就是他们自己已经用一堆样本数据训练好的结果,可以直接用来做转换。
# 当前目录为 wenet/runtime/libtorch
wget https://wenet-1256283475.cos.ap-shanghai.myqcloud.com/models/aishell/20210601_u2%2B%2B_conformer_libtorch.tar.gz
tar -xf 20210601_u2++_conformer_libtorch.tar.gz
# 因为示例里面后面传入model目录用的这个名字,先改成一样的
mv 20210601_u2++_conformer_libtorch 20210602_unified_transformer_server
搞个wav命名成test.wav
开启server
export GLOG_logtostderr=1
export GLOG_v=2
model_dir=./20210602_unified_transformer_server
./build/bin/websocket_server_main \
--port 10086 \
--chunk_size 16 \
--model_path $model_dir/final.zip \
--unit_path $model_dir/units.txt 2>&1 | tee server.log
启动client
export GLOG_logtostderr=1
export GLOG_v=2
wav_path=test.wav
./build/bin/websocket_client_main \
--hostname 127.0.0.1 --port 10086 \
--wav_path $wav_path 2>&1 | tee client.log
正常可以通过nvidia-smi查看server已经用到gpu了,另外发现头两次转换特别慢,之后会快不少,不知道为什么,以后再研究,然后这个是C++版本的,还想再折腾以下python版本的,实际开发起来会方便一点,这个后续再更新