搭建 Docker Swarm GPU 集群 並 部署 OpenFaas 深度學習模型算法服務

2021-02-21 狗哥不苟

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>:2377

Step 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 的文檔)

相關焦點

  • 使用docker swarm 搭建docker集群
    簡介Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個伺服器或主機上創建多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上創建容器集群服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。
  • Docker Swarm集群管理
    1、Swarm原理Swarm集群由多個運行在swarm mode的docker主機組成,這些docker主機分為管理節點(manager)和工作節點(work node)。Swarm mananger節點負責整個集群的管理工作包括集群配置、服務管理等;Work node節點主要負責運行相應的服務來執行任務(task)。
  • 一鍵搭建深度學習平臺,基於Docker/Mesos和NVIDIA GPU詳細教程
    NVIDIA GPU 可以大大加快 Deep Learning 任務的運行速度;同時, GPU 資源又是十分昂貴的,需要儘可能提高 GPU 資源的利用率。
  • 使用Docker Swarm來運行服務
    在今天的文章中,我們將探討如何使用Docker Swarm來部署服務。在我們使用Docker Engine Swarm部署服務之前,我們需要建立一個Swarm集群。因為我們需要1.12新添加的功能,所以我們也要安裝Docker Engine的最新版本。以下步驟將指導你在Ubuntu 16.04上安裝Docker Engine。
  • 如何使用Docker Machine創建Swarm集群
    它的原始碼託管在GitHub(https://github.com/docker/machine)。在這篇文章中,我先簡單介紹Docker Machine,再講述怎麼用它創建Swarm Docker集群。一旦你從單機測試過度到多機器分布式部署,這工具相當有用。Docker Compose用來啟動你在Swarm集群中的應用,這個我會在以後的文章中詳細敘述。
  • 使用Docker部署Redis集群
    →[設為星標⭐]譯者註: 這是github上一個用Docer Swarm,Docker Compose和Supervisor部署Redis集群的項目,這裡翻譯的只是README,具體操作細節建議直接閱讀腳本,裡面有很多地方值得參考
  • 通過Docker部署深度學習項目環境
    深度學習環境部署的方法有很多種,其中Docker化深度學習環境和項目是一個很不錯的選擇。
  • 代碼級操作指南 如何在Docker Swarm中運行服務
    在今天的文章中,小數將和大家探討如何利用Docker的Swarm Mode進行服務部署。在Ubuntu 16.04之上激活Swarm Mode在向Docker Engine Swarm部署一項服務之前,我們首先需要設置一套Swarm集群。由於本文旨在展示1.12版本中的各項新增功能,因此我們應當安裝Docker Engine的最新版本。
  • 用 TFserving 部署深度學習模型
    你可能會考慮一些問題:目前流行的深度學習框架Tensorflow和Pytorch, Pytorch官方並沒有提供合適的線上部署方案;Tensorflow則提供了TFserving方案來部署線上模型推理。另外,Model Server for Apache MXNet 為MXNet模型提供推理服務。
  • 如何使用Kubernetes GPU集群自動化深度學習訓練?
    該指南能幫助同行研究者和愛好者們輕鬆地使用 Kubernetex GPU 集群來自動化和加速他們的深度學習訓練。因此,我將解釋如何輕鬆地在多個 Ubuntu 16.04 裸機伺服器上搭建一個 GPU 集群,並提供一些有用的腳本和.yaml 文件來完成這些工作。另外,如果你需要把 Kubernetes GPU 集群用於其他地方,該指南可能對你也有幫助。
  • Docker 集群工具對比:Kubernetes vs Docker Swarm
    Kubernetes 提升了 Docker 容器集群的管理層次,但同時它的學習曲線也是非常陡峭的。如果你習慣了使用 Docker Compose 來運行容器,你可以繼續使用它去運行內部的大量集群。無論你選擇哪種方式運行你的容器,改變的是你只是在一個更大規模的集群上運行你的容器。Kubernetes 需要你學習它的 CLI 和配置。你不能使用 docker-compose.yml 定義你早先創建的容器。你必須創建 Kubernetes 等同的設備。
  • Kubernetes vs Docker Swarm:有什麼區別?
    集群是容器技術的重要組成部分,它允許管理員創建一個提供冗餘的合作系統組。在節點中斷的情況下,可以啟用Docker Swarm故障轉移。在Docker swarm集群的幫助下,管理員以及開發人員可以隨著計算需求的變化而增加或減少容器的迭代次數。對於想要獲得更多支持的公司,還有Docker的Docker企業即服務(EaaS)。
  • 在Docker Swarm模式下,Docker應用如何實現服務發現
    如果你已經安裝了Vagrant和Virtualbox,可用以下方式來啟動一個Docker Swarm集群:$ git clone https://github.com/jlk/docker-swarm-mode-vagrant.gitCloning into 'docker-swarm-mode-vagrant'...
  • 使用Docker Swarm創建Overlay Network
    如果是在Windows 和 OS X,Docker Machine可以很方便做本地測試,但是當用Docker Machine在你喜歡的雲主機上啟動Docker主機、創建集群時在也添加了另一個維度。後來我們使用Machine直接進入高級的主題,使用Docker Swarm來創建一個Docker主機集群。生產級別的分布式應用需在在Docker主機集群上部署。
  • 教程 | 如何使用 Kubernetes 輕鬆部署深度學習模型
    本文展示了如何用 Keras 構建深度學習模型的簡單示例,將其作為一個用 Flask 實現的 REST API,並使用 Docker 和 Kubernetes 進行部署。本文給出的並不是一個魯棒性很好的能夠用於生產的示例,它只是為那些聽說過 Kubernetes 但沒有動手嘗試過的人編寫的快速上手指南。
  • 啟用Docker虛擬機GPU,加速深度學習
    但我覺得還是有必要記錄一下我最近一次的深度學習環境配置,主要原因在於各種軟體在快速更新,對應的安裝配置方法也會有一些變化。這篇深度學習環境配置有兩個關鍵詞,一個是Docker虛擬機,另一個是GPU加速。開始之前Docker虛擬機首先說一下Docker虛擬機。為什麼需要虛擬機?
  • 基於TensorFlow、Docker和Flask部署深度學習模型
    畢業設計期間很多同學不停向我諮詢深度學習在web應用上的實現以及部署問題,特給大家推出如下文章。
  • Docker 實戰總結(非常全面),收藏了!
    更多參考:Docker Swarm集群部署實踐對比K8s究竟有何異同?Google根據其在Linux上容器管理經驗,改造到docker管理上,就是kubernetes。他的在許多方面表現良好,最重要的是構造於Google多年的寶貴經驗只上。kubernetes並不是為了docker寫的,kubernetes把集群帶到了一個全新的高度,代價是學習曲線比較陡。docker-swarm 使用了一個不同的方式,它是docker原生的集群工具。
  • 如何在AWS GPU示例上設置深度學習環境
    作者 | Murat Vurucu編譯 | 聶震坤設置環境在亞馬遜的網絡服務上建立虛擬機。為此,需要選擇正確的硬體和軟體包來構建深度學習模型。深度學習模型需要消耗大量的計算能力來進行非常大的矩陣運算。AWS上有兩個硬體選項:僅CPU或GPU。GPU代表圖形處理單元。
  • 推薦系統工程篇之搭建以圖搜圖服務
    基於這樣的項目背景,所以才想搭建一個以圖搜圖的服務來進行小視頻的封面圖召回。因為之前使用過 gRPC 封裝過 Faiss 來搭建向量召回服務,在加上之前做過圖片的分類項目,都是將圖片轉換為向量作為分類器的輸入,所以要做這個事基本要解決兩件事:1.對圖片進行預處理,並將其轉換為固定長度的向量2.將各個圖片的向量錄入 Faiss,並使用其完成向量搜索的任務比如在博文Faiss 在項目中的使用[1]中,作者就是使用 SIFT 算法進行圖片特徵的提取