Hi 小夥伴們 大家好,我是狗哥,這次按時更新(x2)啦!
本周狗哥嘗試在 OpenFaas 框架中加入需要使用 GPU 計算的深度學習模型算法服務,因此需要攻克 Docker 中使用 GPU 資源的問題,經過一周的研究實踐,終於找到了 Docker 使用 Nvidia 顯卡資源的方案,此外還編寫了一個基於 Centos 7 的 OpenFaas Python3-Flask 的 Dockerfile 模板。
Step 00 環境準備
首先需要一臺配有 獨立顯卡 的計算機(伺服器),一般採用 Nvidia 系列的顯卡 用於深度學習實驗或服務計算。狗哥實驗用的機器是配有一塊 Nvidia GeForce GT 730 獨立顯卡的臺式機,作業系統選用了 Centos 7.8 2003 版本。
Step 01 安裝顯卡驅動程序
首先從官網找到與本機顯卡向匹配的顯卡驅動程序
Nvidia 官方驅動下載地址:https://www.nvidia.cn/Download/index.aspx?lang=cn
根據顯卡型號可以下載到驅動文件:NVIDIA-Linux-x86_64-450.80.02.run
安裝 Nvidia 顯卡驅動程序前需要安裝依賴並修改系統部分配置文件,腳本命令如下:
yum install -y wget gcc gcc-c++yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /usr/lib/modprobe.d/dist-blacklist.confecho "options nouveau modeset=0" >> /usr/lib/modprobe.d/dist-blacklist.conf
tee /etc/modprobe.d/blacklist-nvidia.conf <<-'EOF'blacklist nvidiablacklist nvidia-drmblacklist nvidia-modesetEOF
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
dracut /boot/initramfs-$(uname -r).img $(uname -r)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot now重啟完成後開始安裝 Nvidia 顯卡驅動:
cd ~wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/450.80.02/NVIDIA-Linux-x86_64-450.80.02.run./NVIDIA-Linux-x86_64-450.80.02.run --kernel-source-path=/usr/src/kernels/$(uname -r) -k $(uname -r)nvidia-smi顯卡驅動程序安裝完成後,輸入命令:nvidia-smi ,顯示如下畫面表示安裝成功:
Step 02 安裝 Docker
Docker Swarm Master 及 Docker Swarm Works 的安裝腳本如下:
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engineyum install -y yum-utilssudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo yum install -y docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://i1el1i0w.mirror.aliyuncs.com"]}EOF
sed -i 's#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375#g' /lib/systemd/system/docker.service
firewall-cmd --permanent --add-port=2375/tcpfirewall-cmd --permanent --add-port=2377/tcpfirewall-cmd --permanent --add-port=4789/udpfirewall-cmd --permanent --add-port=7946/udpfirewall-cmd --permanent --add-port=7946/tcpfirewall-cmd --reload
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p
sudo systemctl start dockersudo systemctl enable dockerdocker run -d -p 9000:9000 --restart=always --name prtainer portainer/portainerdocker swarm init
docker swarm join --token <tocken> <docker_swarm_master_ip>:2377Step 03 安裝 nvidia-docker
安裝 nvidia-docker 需要先增加 Centos 的 repo 後才能安裝,命令如下:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https:
DIST=$(sed -n 's/releasever=//p' /etc/yum.conf)DIST=${DIST:-$(. /etc/os-release; echo $VERSION_ID)}yum makecache -y
yum install -y nvidia-container-toolkit nvidia-docker2
tee /etc/docker/daemon.json <<-'EOF'{ "insecure-registries":[], "registry-mirrors": ["https://i1el1i0w.mirror.aliyuncs.com"], "max-concurrent-downloads": 10, "max-concurrent-uploads": 20, "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } }}EOF
systemctl restart docker
nvidia-docker version如果命名返回信息如圖,表示 nvidia-docker 安裝成功
Step 04 測試 Docker 使用 nvidia 顯卡資源
重啟 Docker 後可以嘗試如下命令測試容器是否可以調用顯卡資源:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi如果啟動的容器執行命令後返回了顯卡信息,則表示該容器已經可以成功的使用Nvidia顯卡計算資源了!
Step 05 部署 OpenFaas GPU 深度學習模型算法服務測試
最後,狗哥分享一下 OpenFaas Python3-Flask 程序 的封裝。
狗哥喜歡用 Python3 於是研讀了 OpenFaas 的說明文檔,其中有一篇關於效率的文檔,其中給出了 Python3-Flask 模板。
官網文檔連結:
狗哥看了 python3-flask-debian 模板後深受啟發,於是想編寫一個具有 Nvidia 驅動、 CUDA 以及 Python3-Flask 的模板。
項目地址:https://github.com/openfaas-incubator/python-flask-template/tree/master/template/python3-flask-debian
根據項目邏輯與結構可知,僅需更改 Dockerfile 即可,Dockerfile 變更如下:
FROM openfaas/of-watchdog:0.7.7 as watchdogFROM nvidia/cuda:10.2-cudnn7-runtime-centos7
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdogRUN chmod +x /usr/bin/fwatchdog
ARG ADDITIONAL_PACKAGE
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && curl http://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/CentOS-Base.repo
RUN yum-config-manager --disable cuda nvidia-ml \ && yum clean all && yum clean metadata && yum makecache \ && yum install -y python3 python3-devel wget git gcc gcc-c++ openssl-devel make \ && wget https://hub.fastgit.org/Kitware/CMake/releases/download/v3.18.4/cmake-3.18.4-Linux-x86_64.sh -q -O /tmp/cmake-install.sh \ && chmod u+x /tmp/cmake-install.sh \ && mkdir /usr/bin/cmake \ && /tmp/cmake-install.sh --skip-license --prefix=/usr/bin/cmake \ && rm -rf /tmp/cmake-install.sh \ && mv /usr/bin/python /usr/bin/python.bak \ && ln -s /usr/bin/python3.6 /usr/bin/python \ && ln -s /usr/bin/pip3 /usr/bin/pip \ && sed -i 's@/usr/bin/python@/usr/bin/python2@' /usr/bin/yum && sed -i 's@/usr/bin/python@/usr/bin/python2@' /usr/libexec/urlgrabber-ext-down
ENV PATH=$PATH:/usr/bin/cmake/bin
RUN adduser app
USER app
ENV PATH=$PATH:/home/app/.local/bin:/usr/bin/cmake/bin
WORKDIR /home/app/
COPY index.py .COPY requirements.txt .
USER rootRUN pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
USER app
RUN mkdir -p functionRUN touch ./function/__init__.pyWORKDIR /home/app/function/COPY function/requirements.txt .RUN pip install --user -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
WORKDIR /home/app/
USER root
COPY function functionRUN chown -R app:app ./
USER app
ENV fprocess="python index.py"
ENV cgi_headers="true"ENV mode="http"ENV upstream_url="http://127.0.0.1:5000"
HEALTHCHECK --interval=5s CMD [ -e /tmp/.lock ] || exit 1
CMD ["fwatchdog"]可以在 template.yml 中修改本模板的語言名稱:
language: python3-flask-centos-gpufprocess: python index.py之後將此模板放入 openfaas 項目的 template 文件夾中,並命名模板文件夾為
python3-flask-centos-gpu
之後就可以使用命令創建 GPU 深度模型算法的服務應用了:
# GPU 算法faas-cli new --lang python3-flask-centos-gpu alg-name
# 製作鏡像faas-cli build -f ./alg-name.yml
# 部署服務faas-cli deploy -f ./alg-name.yml到此就是 Docker Swarm OpenFaas GPU 服務應用部署的全流程了,小夥伴們有什麼問題不?
如果小夥伴們有好的建議或者有想了解的技術知識,歡迎評論或者來狗哥的公眾號 【狗哥不苟】 下留言~
---- / END / ----
狗哥不苟 就是這樣分享乾貨
未經授權禁止轉載
若有問題歡迎反饋
(點擊原文查看 OpenFaas 關於 Performance 的文檔)