如何低成本的在Docker中運行TensorFlow

摘要:

運行深度學習算法的需要一些計算能力,這主要由GPU提供。 但是我想在雲計算的時代幾乎不會有人喜歡,從頭搭建那麼多複雜的技術棧,那些工具,而且一個Tesla還很貴,心血來潮買個大GPU,然後丟在那裏讓它生鏽麼?我們喜歡在在Docker容器中安裝它們,以避免污染其他程序,並能夠與其他人分享結果。 這意味着我必須配置Docker來使用GPU的計算能力。另外談到低成本,我想你對阿里雲或者騰訊雲應該充滿怨言了,因爲真的很貴。

1. 選擇雲服務提供商

先來聊聊成本,讓我們來簡單對比下國外的標杆AWS和國內的一哥阿里雲。

  • AWS:

    我選擇的是AWS EC2 P2,1塊Tesla K80 GPU, 4C-61G。
    這裏寫圖片描述

    價格(這裏選的是競價實例,這個地方需要解釋下,競價實例會在有更高的價格時會回收,比按需的要便宜80%左右,但是價格很穩定,如果你價格定的合理,按照這個文章分析,你不會擔心輕易回收的問題。我也希望阿里雲有類似產品):這裏寫圖片描述這裏寫圖片描述它是按小時計費的,一個月下來,1321元

  • 阿里雲
    這裏寫圖片描述
    同樣是爲了科學上網的海外服務器,按月付費,每月5432元,且配置,1塊Tesla P100 GPU, 4C-30G。內存比P2少一半,GPU半斤八兩,但價格是AWS的接近5倍。我想你知道該怎麼選了。


經過調研,發現在2018年初,阿里雲也推出了競價實例,只不過優惠幅度不太大而且經常缺貨,目前我每沒看到該產品的入口,歡迎指正。

2. 在該實例上準備驅動和容器運行時

我們假設你在第一步通過對比做了理性選擇。

  • 在該節點上安裝驅動:
    參考:這個地方,不過這裏針對的是1.0 版本,不能照抄,也許你看到的時候已經改成2.0了,但是並不影響本文的正確性。
# Install official NVIDIA driver package
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/cuda.list'
sudo apt-get update && sudo apt-get install -y --no-install-recommends linux-headers-generic dkms cuda-drivers
  • 在該節點上部署nvidia-docker2

更新apt源

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

安裝nvidia-docker2

sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd

That’s all! 是不是躍躍欲試了,跑個測試吧:

docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

nice!
這裏寫圖片描述

現在看起來,參數有些多哦,那麼編輯下/etc/docker/daemon.json:
重啓Dokcer後,就可以不用帶--runtime=nvidia這個啦。

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

3. 運行個能夠使用GPU的Docker容器

這是我們最終的目的,幸運的是,NVIDIA的工程師找到了一種從主機到容器共享GPU驅動程序的方法,而無需單獨在每個容器上安裝它們。在hub裏有一個Registry很好玩:tensorflow/tensorflow

  • Start CPU only container(只有CPU計算能力)
docker run -it -p 8888:8888 tensorflow/tensorflow

會吐出來token,接着打開這個吧,jupyter!http://public_ip:8888/?token={your-token}

  • Start GPU (CUDA) container
nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu

因爲Docker的配置文件中已經指定了運行時,所有這個命令可以被docker命令替代:

docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu

接着打開jupyter!http://public_ip:8888/?token={your-token}

cool

這裏寫圖片描述

跑跑看,TF So Cool!高效的開始你的AI之路吧!

後面會準備下,如何在kubernetes裏集成這些,然後我的最終目的是準備出一個合適的鏡像能夠和OpenFaaS結合起來,以極低的成本開放出去。如果您也感興趣,歡迎給我留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章