1. 环境准备:从硬件检查到Docker容器创建

第一次接触寒武纪MLU-270加速卡时,我花了整整两天时间才搞明白硬件和基础环境的配置。现在把这些经验总结出来,帮你省去踩坑的时间。首先确认你的主板有PCIe x16插槽(就是通常插显卡的位置),把MLU-270卡稳稳插入并固定好。别小看这个物理安装,我遇到过因为没插紧导致系统识别不到设备的情况。

装好硬件后,我们需要检查系统是否识别到了设备。在Ubuntu终端输入:

sudo apt-get install pciutils
lspci | grep cabc

如果看到类似"Device 1234:5678"的输出(具体ID会根据设备型号变化),说明硬件识别成功。这里有个细节要注意:有些主板需要在BIOS里开启Above 4G Decoding选项,否则可能出现设备识别不全的问题。

接下来准备软件环境。从寒武纪官方或供应商处获取的安装包通常包含这些关键文件:

  • neuware-mlu270-driver-dkms_*.deb(驱动包)
  • cntoolkit_*.deb(工具链)
  • cnml_*.deb(机器学习库)

建议新建一个专用文件夹存放这些安装包,比如~/neuwareBasic。我习惯用日期+版本号命名文件夹,这样多版本管理时不会混乱。现在我们来创建Docker容器,这个步骤比较关键,建议直接复制下面的完整命令:

export MY_CONTAINER="Cambricon-MLU270-Env"
sudo docker run \
  -e DISPLAY=unix$DISPLAY \
  --device /dev/cambricon_dev0 \
  --net=host \
  --pid=host \
  -v /sys/kernel/debug:/sys/kernel/debug \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v $PWD/neuwareBasic:/workdir \
  -w /workdir \
  -it \
  --privileged \
  --name $MY_CONTAINER \
  cambricon/test/ubuntu:v6.0 \
  /bin/bash

这个命令做了几件重要的事:将主机设备映射到容器、挂载调试目录、设置工作目录为/workdir(对应本地的neuwareBasic文件夹),并使用特权模式运行。特别注意--device /dev/cambricon_dev0这个参数,没有它容器内就无法访问加速卡。

2. 驱动安装:解决依赖问题的实战技巧

进入容器后,真正的挑战才开始。我遇到过各种依赖问题,最夸张的一次花了三小时才解决。先安装基础驱动:

cd /workdir
dpkg -i neuware-mlu270-driver-dkms_4.9.2_all.deb

这时候大概率会报错,别慌,这是正常现象。常见的错误有两种:一是缺少内核头文件,二是依赖不满足。对于第一种情况,执行:

apt-get update
apt-get install linux-headers-$(uname -r)

安装工具包时更要注意顺序:

dpkg -i cntoolkit_1.7.3-2.ubuntu16.04_amd64.deb
cd /var/cntoolkit-1.7.3
dpkg -i *.deb

这里有个小技巧:如果遇到依赖错误,可以先apt-get install -f尝试自动修复,不行就手动安装缺失的包。我整理了一份常见依赖清单:

  • libcnrt(运行时库)
  • libcnml(机器学习库)
  • libcnplugin(插件库)

安装完成后,立即验证是否成功:

cnmon

如果看到MLU卡的实时监控界面(包括温度、内存占用等信息),恭喜你过了第一关。没显示的话,检查下/dev/cambricon*设备是否存在,必要时重启容器。

3. 环境配置:让工具链随手可用

环境变量设置是很多新手会忽略的部分。我有次因为漏设LD_LIBRARY_PATH,调试了一整天找不到原因。打开~/.bashrc文件,在末尾添加这些关键配置:

export PATH=/usr/local/neuware/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/neuware/lib64:$LD_LIBRARY_PATH
export NEUWARE_HOME=/usr/local/neuware

保存后执行source ~/.bashrc立即生效。验证环境是否配好有个简单方法:

cncc --version

如果显示编译器版本信息,说明PATH设置正确;再运行一个简单的测试程序:

cd $NEUWARE_HOME/examples
make

这里要特别注意权限问题。我遇到过因为容器用户权限不足导致编译失败的情况,解决方法是在docker run时加上-u root参数,或者在容器内用sudo执行。

4. 常见问题排查:我踩过的那些坑

第一次成功运行程序后,我以为大功告成了,结果第二天就遇到设备丢失的问题。分享几个典型故障的解决方法:

问题一:设备突然不可用 现象:cnmon显示No device found 解决方法:

sudo rmmod cambricon_drv
sudo modprobe cambricon_drv

这相当于重启驱动模块,比重启整个系统快多了。

问题二:内存不足错误 MLU-270有16GB板载内存,但默认分配可能较小。通过设置环境变量调整:

export CNRT_MEM_POOL_SIZE=1024

单位是MB,根据你的应用需求调整。

问题三:多卡设备号混乱 当系统中有多张MLU卡时,设备号可能变化。建议固定设备号:

echo 'SUBSYSTEM=="cambricon", KERNEL=="cambricon_dev*", MODE="0666"' > /etc/udev/rules.d/99-cambricon.rules

性能调优方面,我总结了几条经验:

  • 使用CNRT的异步执行模式提升吞吐量
  • 合理设置batch size,太大太小都会影响效率
  • 启用MLU的TensorCore加速:
export CNML_USE_TENSORCORE=1

最后提醒一个容易忽视的点:定期检查驱动版本。寒武纪大约每季度会发布新驱动,包含性能优化和bug修复。升级前记得备份重要数据,我吃过没备份的亏。

更多推荐