[Share Experiences] Deepin Learning on Deepin —— 基础环境架设
Tofloor
poster avatar
fuuko
deepin
2021-08-21 20:54
Author

Deepin Learning on Deepin —— 基础环境架设

日期:2021821

作者:南风LI

背景

最近因为公司项目需要,自己花费了大量精力研究如何在已经存在一些合适的深度学习算法的时候,去挑选、训练、测试、部署这些算法。由于本人并不是 AI 相关专业或者说这个领域的专业从业者,所以本文仅从工程实施角度来进行说明如何部署这套环境。

适合本文的读者:想利用深度学习技术解决项目难题的工程师,算法原理已经非常熟练但是不知道怎么落地的科研人员,以及其它在环境架设上疯狂碰壁的新入门的小白。

在本文中,我假设你已经入门了 Python C++,并大致了解 Debian 系操作系统的基本玩法,同时我也假设你的 GPU 计算设备是 NVIDIA 的。

为了聚焦本文主题,我不会详细介绍什么是深度学习,也不会详细介绍文章内所涉及的相关框架。

Deepin OS 简介

本文的系统环境是基于 Deepin OS 的,这是由国内的武汉深之度开发的、基于 Debian 的操作系统。它目前有以下几个特点:

  • 一个比较注重用户体验的国产操作系统,虽然还很拉跨,但能用,且适合拿来做开发
  • 绝大部分操作和 Debian Ubuntu 相似,你甚至可以直接套用这两者的资料
  • 拥有强大的 Deepin-Wine,能够让你在训练到一半的时候,能在电脑上截屏并发到 QQ 上和好友分享你的进度,不至于太孤独

嘛,这也算是给国产系统打个广告了,希望它有朝一日可以干掉 bug10 bug11,同时成长为比 Fedora Ubuntu 更流行的开发用 Linux

PS:虽然国产系统现在依旧不好用,但你们都不用且都不去提建议的话,它就只能一直不好用。

PPSDeepin OS 有个弟弟叫 UOS,两兄弟长得很像,但 UOS 更适合政企单位或者个人日常办公,并不像 Deepin 这样适合搞开发。

系统安装

系统安装非常简单,首先前往官方网站下载镜像和启动盘制作工具,找一个U盘直接刻入,修改 BIOS 引导顺序,插入U盘开始启动电脑......都是比较常规的操作。

不常规的地方只有三个:

  • 不要选择安装 NVIDIA 闭源驱动,因为即便你选了,你也用不成 nvidia-smi 命令来监控显卡情况,大概率也用不成 CUDA(或者你们哪位大佬是可以的,麻烦指导一下)
  • 一定要手动分区,然后根目录搞大一些,因为后续的安装基本上都是丢在根目录下的。如果你偷懒选择自动全盘安装,那么你可能会遭遇只有 15GB 大小的根目录,这会直接让后续的安装软件报告硬盘空间不足
  • 在改 BIOS 引导顺序的时候顺便关闭安全启动模式(Secure Boot),方便我们后面装官方的显卡驱动

至此,你的系统应该已经安装在了电脑上,在点过了欢迎界面(就是选特效还是普通),请继续以下操作以优化后续体验:

  • 点开控制中心,关闭系统自动更新功能以防止系统环境被破坏
  • 在控制中心中调整电源策略,禁止系统关闭显示器、锁屏、休眠
  • 多屏用户打开终端,执行命令 gsettings set com.deepin.dde.dock.mainwidow only-show-primary true 以固定下方任务栏
  • root 权限打开 /etc/apt/source.list,把下面注释掉的 deb-src 部分放开。

至此,系统基本安装完毕,在我们进一步折腾环境前,可以先去商店把你需要的软件,比如 QQ 什么的都装上,因为一会儿开始折腾环境的时候,大概率会让这些软件无法正常安装。

另外可能会有同学尝试在虚拟机下部署这个系统,emmmmmm,折腾显卡虚拟化更折磨人。什么?你想用 CPU 跑深度学习?emmmmmm,请让我叫你一声勇士。

NVIDIA 显卡驱动、CUDAcuDNN

至此,你的操作系统已经准备就绪,现在让我们来进行一项非常蛋疼且非常容易让人重装系统的操作:安装 NVIDIA 官方闭源驱动、CUDA驱动、cuDNN 库。

那么问题来了,这三者是什么关系?大概就是 cuDNN 依赖 CUDACUDA 同时依赖显卡驱动和显卡硬件,而要想显卡硬件正常工作,就需要 NVIDIA 的官方闭源驱动(你说你是 AMD 的卡?啊这,AMD 的卡我还没折腾过==

知道三者的关系后,再来看深度学习等一系列依赖 NV 显卡的专业软件:他们大都是依赖于使用 CUDA 进行计算加速,同时如果有 cuDNN 库,他们会加速加得更猛烈一些,嗯,大概是这样的。

这里为了保证驱动和 CUDA 的兼容性,我们直接下载 CUDA 的驱动。由于我前面说过,Deepin OS Ubuntu 之流其实非常相似,但由于这个系统的影响力还不够,所以我们只能将就一下 Ubuntu 或者 Debian 系统的驱动。

这里我选择的是 x86_64/Ubuntu/20.04/runfile(local),选择完毕后,如下图所示,网页下方会出现两条命令:

第一条是下载命令,直接在终端执行就行,或者用其它下载器进行下载(推荐 Free Download Manager)。

第二条是安装命令,需要在下载完成后执行。

执行安装命令后等待一段时间,它会在终端里要求你选择安装一系列的组件,其中我们需要先去掉里面的显卡驱动,只去安装剩余的 CUDA 组件(光标对准敲回车,有 X 表示安装此项)。当 CUDA 组件安装完成时,你会发现它会提示没有可用的驱动,使用 xxx 命令进行安装(没记错的话应该是 sudo ./yyy.run --slient --driveryyy.run 是你下载的驱动文件的路径)。OK,这表示目前 CUDA 组件安装完毕,但是缺少驱动的支持,无法正常工作,而这个命令就是不进这个界面,直接在后台静默安装驱动的命令,把它用手机拍下来,或者用纸记下来备用。

接下来安装显卡驱动,需要按以下步骤操作:

  • 禁用 nouveau 开源驱动
    • 打开终端,执行 sudo vi /etc/modprobe.d/blacklist.conf
    • 在最后一行添加 blacklist nouveau
    • 如果提示是新文件,那么也不用管,直接保存就是了
    • 执行 sudo update-initramfs -u
    • 重启电脑,并在登录界面切入 tty
    • 执行 lsmod | grep nouveau,没有输出信息则表示禁用成功(其实看登录界面看得出来)
  • 停止 X Server
    • tty 中执行 sudo telinit 3
  • 安装驱动
    • 切到你保存驱动的位置,然后执行你刚才记下来的命令(应该是sudo ./yyy.run --slient --driver,主要是后面的两个参数)
    • 等待执行完毕(时间会比较长),然后重启系统
  • 检查与测试
    • 检查显卡驱动:终端执行 nvidia-smi,有输出则表示驱动安装成功
    • 检查 CUDA 驱动:进入目录 /usr/local/cudaxxx/bin xxx是你的 CUDA 版本,不过我怎么感觉没有版本号,反正是 cuda 开头的文件夹)执行 ./nvcc,输出正常表示安装成功
    • 添加 CUDA 路径至环境变量中(注意尽量加到本地,加到全局去有可能造成系统登录的时候 X Server 找不到系统应用,导致循环登录)

至此 CUDA 环境已经部署完毕,接下来开始安装令人想大喊一声 NVIDIA fxxk you !  cuDNN 库。

首先要去 NV 开发者官网 注册账号成为会员,然后登录进网站。接着再点开 cuDNN主页 选择和刚才下载的 CUDA 所匹配的 cuDNN 库。emmmmm,大概有 1.5GB 左右吧。而且中间还要填一份又臭又长的问卷调查,唉。。。

这个地方最大的坑就是,因为众所周知的原因,这个网站非常慢,且会员注册需要某种不存在的手段才能注册成功,否则会因为看不到验证码而被拒绝入会。。。。。。为啥很想 fxxk 它呢?我都花这么多钱买你的显卡了,这点开发工具还藏着掖着。。。。。。AMD 啥时候才能在专业应用上把 NV 给干了啊啊啊啊啊啊啊。

cuDNN 的安装就简单了,直接解压,然后把头文件贴到 CUDA 的头文件路径下,把库文件贴到 CUDA 的库文件路径下(是的,俩直接贴贴),这样就完成了安装。

如果到目前为止,你的安装一切顺利没有报错,所有的检测都通过,那么恭喜,基础环境已经搭建完毕,准备进入更高层的开发环境搭建。

什么?你 xxx 地方报错了?emmmmm,自己想办法解决吧,不行就回去重装系统。。。尤其是 Intel 核显 + NV 独显的同学,请跟我一起喊:NVIDIA fxxk you !(我的是单的 NV 独显,没有这个问题)

PSDeepin 貌似有显卡切换工具,可以去下一个来试试

Caffe 框架的编译、安装、测试

至此,你的操作系统和显卡应该已经准备就绪,按理说最痛苦的地方已经结束,接下来我们开始尝试安装深度学习框架的老大哥:Caffe .

但是这里我准备着重介绍 NVIDIA 版本的 Caffe 如何在 Deepin OS 上进行编译安装和测试。嗯?你说为啥不介绍伯克利那个原版的?因为原版已经停更一年多,且显存占用优化和效率优化被 NV 版的吊打,还不支持 8.x 版本的 cuDNN ~ 所以为了更流程的开发体验,建议用 NVIDIA 版的。

顺便再提一嘴:如果你准备在超大数据集上跑深度学习,且准备使用 N 卡进行训练,那么一定要去购买带 Tensor Core 的卡,这个东西可以在一个时钟周期内完成一次 4 * 4 的矩阵乘加运算,懂硬件的朋友应该知道我说的意思。但是这玩意儿就和鞋子上的气垫一样,如果数据量不够大,深度学习框架和显卡驱动可能会不屑于调用 Tensor Core,所以请理性消费。

好了,废话了半天,我们打开项目地址,然后 git clone 也好,直接下载 zip 包也好,总之先把源码扒到本地,然后解压放好。

在进行下一步操作前,我们再做一个骚操作:快速解决 Caffe 编译的环境依赖,根据我最近编译安装它的经验,我们需要按以下步骤进行:

  • sudo apt build-dep caffe
  • 安装 jpeg turbo 的开发库
  • 安装 boost 的正则表达式开发库
  • 安装 Open atlas 的开发库(用 Intel CPU 的朋友可以试一下 MKL 库)

至于我们为啥要安装一下上游仓库 Caffe 的依赖呢(而且还是那个CPU版的)?因为 NVIDIA Caffe 的主干部分和原版基本一致,依赖也基本一致,所以直接套用。那么为啥不装 caffe-cuda 的依赖呢?因为这会导致 Debian 仓库里老掉牙的驱动覆盖掉我们刚刚安装好的驱动(是的,Deepin OS 的软件仓库大部分来自于 Debian)。

其中你可能会看到里面有个叫 jpegturbo62 的东西,然而那不是真正的 jpeg turbo,正版的叫 turbojpeg .

最后,它还有可能会说没找到一个什么 doxygen 文件,直接新建一个同名的空白文件就行。

至此,所有编译依赖解决完毕,然后就是中规中矩的 cmake 编译环节:

  • 去源码目录的根目录下创建 build 目录
  • cd build
  • cmake .. (如果这步有报错的话,就再检查一下输出,要确保没有警告和错误)
  • make -j8
  • make install

至此,我们的编译结果已经放在了 build/install 目录下,然后我们需要执行一下测试。

测试方法我参考了这篇文章,整体测试流程如下:

  • 首先进入终端,把目录切到源码包的根目录下
  • ./data/mnist/get_mnist.sh (最近这个服务器容易抽风,可能要多试几次)
  • ./examples/mnist/create_mnist.sh
  • 编辑 examples/mnist/lenet_solver.prototxt 文件,在最后加上一句 store_blobs_in_old_format: true
  • ./examples/mnist/train_lenet.sh
  • 在上一个命令的执行过程中,在另外一个终端里不断执行 nvidia-smi 命令观察显卡占用

如果期间显卡占用达到一个非常高的值,同时在 examples/mnist 下出现了 xxxx.caffemodel 文件,则表示训练阶段测试成功,而加的那一句表示输出和原版兼容的权重文件。

如果还不过瘾,可以继续以下操作来测试生成的权重文件是否正常且可以兼容原版 Caffe

  • sudo apt install caffe (这一步会自动安装 PyCaffe 相关的库,无需使用 pip
  • 使用这篇文章里实战2中的代码,和他贴出来的手写数字4的图片进行测试(图片需要保存为 BMP 格式以和后续代码一致)

如果一切正常,最后应该会看到和他一样的输出:predicted class: 4

这里为了防止链接失效,同时也因为我本人是 Python3 党,因此在此贴出适合本文步骤的 Python3 版本的测试代码(其实大同小异了~):

import os
import sys
import numpy as np
import caffe

#指定网络结构 与 lenet_train_test.prototxt不同 
MODEL_FILE = '你的caffe路径/examples/mnist/lenet.prototxt' 
PRETRAINED = '你的caffe路径/examples/mnist/lenet_iter_10000.caffemodel'
#图片已经处理成 lenet.prototxt的输入要求(尺寸28x28)且已经二值化为黑白色
IMAGE_FILE = '你的caffe路径/examples/images/test4.bmp'
 
input_image = caffe.io.load_image(IMAGE_FILE, color=False)
net = caffe.Classifier(MODEL_FILE, PRETRAINED) 
prediction = net.predict([input_image], oversample = False)
caffe.set_mode_cpu()
print('predicted class: %d' % prediction[0].argmax())

最后 NVIDIA Caffe 和原版有个最大的不同点:使用 ctrl + c 终止训练时,原版会保存一个当前迭代的结果再退出,而 NV 的会直接退出去,所以要注意观察距离存档点的距离。

NCNN 框架的编译、安装、测试

上一个章节中,我们在 Deepin OS 上拥有了一套可用于深度学习的训练框架,本章我们将选择 NCNN 作为推理框架侧的案例。

老规矩,先去项目地址扒源码。

关于 NCNN 的编译众说纷纭,介绍的时候都会说它是无第三方依赖,直接编就是了,而真正开始编的时候,大家又一边倒地说这玩意儿依赖 OpenCV Protobuf,而 Protobuf 的安装失败率极高。。。。。。

实际上没有那么复杂,如果你仅仅需要 NCNN 的本体,那么给个 g++ 就行了;如果你需要它下面的工具箱、demo,或者是希望启动 Vulkan 加速功能,那么此时才需要安装这坨东西。

那么折腾开始,由于我们前面打了 NVIDIA 的闭源驱动,这里我懒得去折腾 Vulkan,所以就直接忽略(况且 NCNN CPU 优化据说做得很不错),所以我们按照默认模式来进行编译安装,即我们需要工具箱和演示 demo

  • 使用 apt 安装 Protobuf 的编译工具和开发工具(如果不想折腾,请务必用 apt
  • 安装 OpenCV
  • mkdir build && cd build
  • cmake .. (要确保没有提示因为缺 xxx,将不会编译 yyy
  • make -j8
  • make install

至此,如果顺利的话,所有的文件都会存放在 build/install 目录下,包括工具包,NCNN 静态库,演示 demo 等等。然后就是激动人心的测试环节:

  • 将上一个章节生成的 lenet_iter_10000.caffemodel 文件和自带的 lenet.prototxt 文件转移到本章节的 build/tools/caffe 目录下
  • 执行 ./caffe2ncnn lenet.prototxt lenet_iter_10000.caffemodel lenet.param lenet.bin
  • 参照以下 CMake 源码和 C++ 代码组织工程(CMake 代码转载自这里,有少量修改。而 C++ 源码转载自官方例程,也有少量修改)

CMakeLists:

# 设置cmake版本,如果cmake版本过高,可能会出现错误
cmake_minimum_required(VERSION 3.5.1)
project(NCNN_test)

# 设置C++编译版本
set(CMAKE_CXX_STANDARD 11)

# 设置程序编译出的可执行文件
set(MAIN_FILE main.cpp)
set(EXECUTABLE_OUTPUT_PATH ../)

# 分别设置ncnn的链接库和头文件(xxx是你的ncnn的源码路径)
set(NCNN_LIBS /xxx/build/install/lib/libncnn.a)
set(NCNN_INCLUDE_DIRS /xxx/build/install/include)

# 配置OpenMP(这个主要是针对 NCNN 的静态库)
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# 配置OpenCV(编译 NCNN 的时候已经安装了,这里直接用)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

include_directories(${NCNN_INCLUDE_DIRS})

# 建立链接依赖
add_executable(NCNN main.cpp)
target_link_libraries(NCNN ${NCNN_LIBS})
target_link_libraries(NCNN ${OpenCV_LIBS})

main.cpp:

//opencv库,在这里仅用作打开图片用,请根据实际情况选择图片打开库
#include 

//NCNN头文件,提供神经网络的相关操作
#include "net.h"

#include 

int main()
{
    cv::Mat img = cv::imread("test4.bmp", CV_LOAD_IMAGE_GRAYSCALE); //还是上面那个文件
    int w = img.cols;
    int h = img.rows;

    //和官方示例不同,这里需要根据lenet网络特点修改减去的均值和归一化系数,同时还要改输入矩阵的尺寸
    ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, 28, 28);
    float mean[1] = { 0 };
    float norm[1] = { 1/256.f };
    in.substract_mean_normalize(mean, norm);

    //加载前面生成的NCNN网络文件和权重文件
    ncnn::Net net;
    net.load_param("lenet.param");
    net.load_model("lenet.bin");

    //解码器参数
    ncnn::Extractor ex = net.create_extractor();
    ex.set_light_mode(true);
    ex.set_num_threads(4);

    //输入数据
    ex.input("data", in);

    //读取输出
    ncnn::Mat feat;
    ex.extract("output", feat);

    //适配并输出结果
    const float* ptr = m.channel(0);
    float maxScore = ptr[0];
    int maxNo = 0;
    for (int x=1; x maxScore)
      {
        maxScore = ptr[x];
        maxNo = x;
      }
    }
    printf("predicted class: %d", maxNo);

    return 0;
}
  • mkdir build && cd build
  • cmake .. && make -j8

至此如果没报错的话,找到生成的可执行文件,直接./NCNN_test,如果输出结果和上一章节的一致,则表示成功在 Deepin OS 下打通了一条深度学习从开发到部署测试的路(想搞移动端的同学可能得搭个交叉编译平台,又是另外一个主题了 orz)。

这时候赶紧截图通知你们QQ群的爱好者,你成功了~

结语

这篇文章最初是写给我自己看的,我最开始的目标是想仅使用一文来记录这段时间在 Deepin OS 下折腾深度学习的过程。但是现在在论坛里逛了一段时间,我发现大家讨论的都是这个操作系统的基本使用,就连置顶也是把 Deepin 装进口袋的这种非常基础的操作。。。所以写着写着,我的目标变成了在 Deepin 论坛上发布一篇关于 Deepin OS 跑复杂专业应用的博客233333333。

算是给大家展示一下,这个系统不仅仅有 deepin-wine,有与众不同的 DTK 风格软件,它还有能给开发者提供支撑的一系列配套设施。

参考文献

NV闭源驱动安装

CUDA安装

Caffe安装测试

NCNN CMake 编写

NCNN Hello world

Reply Favorite View the author
All Replies
fuuko
deepin
2021-08-21 21:07
#1

好了,看着这篇发出来的排版,我知道为什么没人发这种专业应用的文章了

Reply View the author
sammy-621
deepin
2021-08-21 22:08
#2

嗯,一言难尽

Reply View the author
liwl
deepin
2021-08-22 00:49
#3

楼主明白了吧。你看我的帖子,基本上不愿意多写字……

Reply View the author
sgb76
deepin
2021-08-22 18:15
#4

就冲着楼主码这么多字也得怒赞一下!

Reply View the author
白日梦想家
deepin
2023-07-04 06:35
#5

先赞后看 已经重新安装过一次系统了 NVIDIA f**k you

Reply View the author