十三、在Atlas 200DK上使用MindSpore训练LeNet网络
手写数字识别LeNet是深度学习最简单入门的神经网络。一般拿它来入门AI框架最合适不过了。我们来试一下,看看如何在200DK上跑LeNet:
1、下载models代码仓
git clone https://gitee.com/mindspore/models.git
2、准备MNIST数据集
cd models/official/cv/lenet
mkdir MNIST
mkdir ckpt
cd MNIST
下载MNIST数据集:
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
按照README指定的方式解压:
gzip -d *.gz
mkdir train
mkdir test
mv train*ubyte train/
mv t10k* test/
sudo apt install tree
tree 查看目录结构:
3、训练LeNet网络
cd ..
开始训练:
python train.py --data_path=./MNIST/ --device_target="Ascend" --ckpt_path=./ckpt
报语法错误。
检查一下:
原来200DK的python缺省是Python2版本,print语句不支持 flush=True这种语法。
那就换成python3试一下:
没装yaml,那就装一下pyyaml
python3 -m pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple
这里一开始没有使用 --user,所以报权限错误,后来增加--user参数安装成功。
重新训练:
python3 train.py --data_path=./MNIST/ --device_target="Ascend" --ckpt_path=./ckpt
报错如下:
[CRITICAL] CORE(2461,fffeffff81a0,python3):2022-04-17-02:17:09.597.099 [mindspore/core/utils/ms_context.cc:130] CreateTensorPrintThread] Get acltdt handle failed
Traceback (most recent call last):
File "train.py", line 68, in <module>
train_lenet()
File "/home/HwHiAiUser/models/official/cv/lenet/src/model_utils/moxing_adapter.py", line 108, in wrapped_func
run_func(*args, **kwargs)
File "train.py", line 48, in train_lenet
network = LeNet5(config.num_classes)
File "/home/HwHiAiUser/models/official/cv/lenet/src/lenet.py", line 35, in __init__
super(LeNet5, self).__init__()
File "/home/HwHiAiUser/.local/lib/python3.7/site-packages/mindspore/nn/cell.py", line 119, in __init__
init_pipeline()
RuntimeError: mindspore/core/utils/ms_context.cc:130 CreateTensorPrintThread] Get acltdt handle failed
张小白发帖询问这是什么问题,专家回答道:
张小白恍然大悟。。。在Atlas 200DK上是无法进行模型训练的。
十四、在Ubuntu 18.04 X86上使用MindSpore CPU版训练LeNet网络
张小白没有在200DK上完成LeNet网络训练,这让曾经能在 树莓派4B和Jetson Nano B01完成LeNet训练的张小白感到有些失望。
不过这也挡不住张小白试验LeNet的心,既然无法在200DK上做训练,那么用开发环境ubuntu X86做LeNet训练,然后将训练好的结果送到200DK上做离线推理,应该是可以的吧?
先看下开发环境的环境:
有python3.7.5,但是没有mindspore,那就先在开发环境上安装MindSpore的CPU版本:
按照上面的选择来安装即可:
python3 -m pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.1/MindSpore/cpu/x86_64/mindspore-1.6.1-cp37-cp37m-linux_x86_64.whl --trusted-host http://ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
下载mindpore的modelzoo代码仓:
准备数据集:
cd models/official/cv/lenet
mkdir MNIST
mkdir ckpt
cd MNIST
安装tree
查看数据集结构:
开始训练:
python3 train.py --data_path=./MNIST/ --device_target="CPU" --ckpt_path=./ckpt
。。。
。。。
训练结果在ckpt目录下:
执行评估:
python3 eval.py --data_path MNIST --ckpt_path ckpt/checkpoint_lenet-10_1875.ckpt --device_target="CPU"
导出MindIR模型:
python3 export.py --ckpt_file ckpt/checkpoint_lenet-10_1875.ckpt --file_format "MINDIR" --device_target="CPU"
执行完毕后,会生成一个lenet.mindir文件:
将lenet.mindir和ckpt文件拷贝到200DK上。
scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/
scp -r ckpt HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/
下面来尝试使用训练好的模型在200DK上进行推理。
十五、在Atlas 200DK上编译MindSpore LeNet网络的推理代码
仔细查看了下lenet工程下scripts目录下的相关代码,其中有个run_infer_310.sh貌似就是个运行推理代码的脚本。
根据README:
直接运行试试:
bash run_infer_310.sh ../lenet.mindir ../data dvpp
报错了:
查看ascend310_infer下的build.log的日志:
确认是没有安装gflags包。
开始安装glags:
cd gflags
mkdir build
cd build
cmake .. -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DBUILD_gflags_LIB=ON
make -j8
sudo make install
再安装glog
下载代码仓:
git clone https://github.com/google/glog
cd glog
vi README.rst
根据readme进行安装:
cmake -S . -B build -G "Unix Makefiles"
cmake --build build
sudo cmake --build build --target install
回到lenet工程的ascend310_infer目录,编辑CMakeList.txt文件,增加:find_package(gflags REQUIRED):
再重新执行推理脚本:
bash ./run_infer_310.sh ../lenet.mindir ./images dvpp
仍然是build失败。
检查ascend310_infer/build.log
居然还是这个错。
这个问题折腾了张小白好几天的时间,张小白也请了 MindSpore专家 赵老师帮忙看看。最终发现 去年的一个issue的做法可以解决编译的问题:
https://gitee.com/mindspore/mindspore/issues/I3X1EA
于是如法炮制:
获取gflags安装包:
wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz --no-check-certificate
解压:
tar -zxvf v2.2.2.tar.gz
编译:
cd gflags-2.2.2/
mkdir build
cd build
export CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0
cmake .. -DBUILD_SHARED_LIBS=ON
make -j8
删除上次源码安装好的 /usr/local/lib下libgflags的包:
再make install
重新编译:
终于编译成功,但是紧接着出现了推理失败,这个咱们下一次解决吧!
十六、在Atlas 200DK上运行MindSpore LeNet网络的推理代码
书接上回:https://bbs.huaweicloud.com/blogs/349622
经过多次试验,张小白将run_infer_310.sh文件做如下修改:
(1)将python命令均改为python3,因为当前环境python指向的是Python2。
(2)在执行推理命令之前,新增 以下语句:
export LD_LIBRARY_PATH=HOME/Ascend/ascend−toolkit/5.0.4.alpha005/arm64−linux/opp/opimpl/built−in/aicore/tbe/optiling:LD_LIBRARY_PATH
. /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh
(3)将执行语句最后的 &>xx.log &去掉,将错误信息打印在屏幕上:
(4)修改http://main.cc文件,增加打印文件名的代码:
执行run_infer_310.sh命令并查看结果:
bash ./run_infer_310.sh /home/HwHiAiUser/models/official/cv/lenet/lenet.mindir /home/HwHiAiUser/models/official/cv/lenet/MNIST/test dvpp 0
。。。
虽然看到在preprocess_Result文件夹下有10000个test jpg文件。
下载下来看了下,都是手写的图片:
但是第一个文件就推理失败了!
只好又提了issue,赵老师回答了我的问题:
如法炮制:
先到X86上,编辑export.py文件:
执行export
python3 export.py --ckpt_file ckpt/checkpoint_lenet-10_1875.ckpt --file_format "MINDIR" --device_target="CPU"
可以看到新的mindir文件也已经生成:
将lenet.mindir拷贝到200DK上。
scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/
这个是需要注意的,如果200DK上有同名文件,会报权限错误。
那就删除掉200DK的同名文件:
再回到X86开发环境重新scp:
scp lenet.mindir HwHiAiUser@192.168.199.204:/home/HwHiAiUser/models/official/cv/lenet/
再重新执行推理:
bash ./run_infer_310.sh /home/HwHiAiUser/models/official/cv/lenet/lenet.mindir /home/HwHiAiUser/models/official/cv/lenet/MNIST/test dvpp 0
结果如下:
它会完成10000个测试图片的推理,精度结果是 0.9854.
推理结果放到了 result_Files目录下:
可见已经推理成功!
(未完待续)