摘要:

运行深度学习算法的需要一些计算能力,这主要由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结合起来,以极低的成本开放出去。如果您也感兴趣,欢迎给我留言。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐