专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
未来汽车Daily  ·  5C大战5.5C,真·超充还得看岚图知音 ·  2 天前  
未来汽车Daily  ·  5C大战5.5C,真·超充还得看岚图知音 ·  2 天前  
Java基基  ·  SpringBoot+WebSocket实时 ... ·  6 天前  
Java基基  ·  SpringBoot+WebSocket实时 ... ·  6 天前  
51好读  ›  专栏  ›  分布式实验室

如何利用Docker、AWS和深度学习伪装成一个艺术家

分布式实验室  · 公众号  · 后端  · 2016-12-22 07:45

正文


“能工摹形,巧匠窃意(Good artists copy, great artists steal)” —— 毕加索


在英国第四频道纪录片系列之“Faking it”中,Paul O’Hare(一名来自利物浦的画家和室内装潢师)需要在四个星期的时间内,将自己伪装成一个艺术家,并且尝试着去欺骗伦敦美术馆的评论家。我们将要展示如何利用Docker、AWS和深度学习来完成这个任务,并且完成任务所需的时间控制在半小时内,这甚至包含了你阅读这篇文章的时间。此外,所需的费用不高于$10。

神来之笔

为了加速伪装的速度,我们将会利用一个人工智能系统。这个系统基于深度神经网络,该网络能够创造出和某个艺术家风格一模一样的艺术作品(至少我们是无法辨别的)。这是如何实现的?这是通过将一个图片的内容(肖像画或者风景画)和另外一个图片的样式(这通常是某个知名艺术家的作品)整合在一起实现的。我们将会使用一个叫做neural-style的算法来完成这个任务,它基于强大的深度网络来对图片进行处理。

听起来似乎很复杂,通过直接观看我们新创作的图片,就很容易认识到我们究竟在做什么。看到这些图片,也不枉我们花费上千小时来科研和写代码啊:)。




这个算法神秘的效果是通过复用一个预建立好的深度神经网络(VGG19)来实现的,这个网络是由牛津大学的研究人员和ImageNet Challenge 2014 image processing competition的获胜者开发的。这个网络应用了多层卷积神经网络(CNNs),它能够将一个图片从原始像素提炼成更高层次的、更概念化的表示。事实上,抽象层次之高足以将图片的样式原样地表示出来。正是通过将原始像素转换成样式的方式,系统才能以某个图片的样式来重画另外一个图片的像素。

到目前为止,实现和部署这个算法不是一个简单的任务。我们将会在剩下的内容中解释如何做到它,并且所要求运行的的命令不超过三个。不过在这之前,让我们介绍些更细节的内容。除了VGG19,我们还需要:

  • 一个画板——torch 数据挖掘库,它能够让我们模拟一个画家(基于Justin Johnson的工作)

  • 以及一个加速我们制图过程的方式,毕竟我们不想要花费几天、几个星期,甚至几个月来等待结果。因此,我们将会使用图形处理单元(GPU)加上一个传统的CPU来加速我们的深度学习算法,成功将等待的时间减低到几分钟。 

问题

我们已经很接近目标了。但是我们还需要解决最后一个挑战。工具、库、算法的创新、依赖和变化会使得运行环境被破坏。仅仅是大量的库和依赖就给运行算法带来了许多问题:

  • Nvidia GPU驱动,为了使用GPU

  • CUDA开发套件,为了控制GPU

  • Cudnn库,为了使用GPU深度网络计算

  • Torch7,一个深度网络开发的框架,以及它的依赖(protobuf)

  • Loadcaffe lua 模块,为了加载预建立好的网络,这也是我们应用VGG19的方式。

为了获得更加卓越的结果,我们需要用不同的图片,样式和参数来运行这个算法,而以上的所有软件是自动化这个过程的必需品。这带来了一个非常脆弱的环境,因为只要有任何不可逆转的更新被引入到GPU驱动或者torch库中,整个系统就会停止工作。这意味着不仅仅第一次的环境搭建是繁重的,并且为了保持系统运行,我们还需要一次次地重复这个过程。这离我们的理想状态非常遥远:艺术家灵感出现时,画布必须在手上。类似地,当我们创意迸发时,我们的工具必须能够立马运行,我们不能受制于一个永远在变化的环境。

很明显,Docker是解决这个问题的好办法。但是,还有一个棘手的问题:Docker将我们的进程从环境分离,同时分离了宿主机上的特定硬件资源。不幸的是,我们的深度神经网络算法需要对GPU的直接访问。Docker是基础方法,但是我们还需要其他的东西。


解决办法是nvidia-docker,它对docker进行了封装,允许容器利用NVIDIA GPU。通过这个命令,Docker会通过一个卷自动挂载宿主机上的GPU驱动到容器中,通过这个方式,任何Docker进程就能够在宿主机的GPU上运行代码了。

有了Docker,现在,我们对宿主机的要求直线下降:我们只需要安装Docker,nvidia-docker,以及正确的GPU驱动。剩下的依赖都包含在Docker镜像中,这个镜像通过Dockerfile创建,因此具有可重复创建的特性,同时这保证了所有不断变化的依赖都被固定在某个能够正确工作的版本上。

画图工具

现在我们所需要的仅仅是一个能够运行我们系统的机器。我们使用了公有云,这里选择了AWS和它的GPU优化虚拟机。AWS提供了两个类型的GPU实例,但我们选择了最新的P2 AWS EC2实例。这些实例是专门为了深度学习而设计的,和我们现在的项目很符合。让我们开始构建它吧:

$ docker-machine create — driver amazonec2 \
-- amazonec2-instance-type p2.xlarge \
-- amazonec2-access-key *** \
-- amazonec2-secret-key *** nvidia-docker

在运行这个命令前,你需要:

  1. 安装Docker on Mac,Docker on Windows,或者docker-machine。

  2. 创建AWS的账户。不幸的是,P2或G2实例不包含在AWS免费计划中,但我们可以花费少于$10的金钱来创造大量的艺术品。如果你的电脑拥有一个NUIDA GPU,那么你也能够在本地运行我们的脚本。

  3. 创建一个access/secret密钥对

  4. 由于默认情况下你不允许使用P2和G2实例,因此你需要在AWS上打开一个ticket来增加P2和G2实例的使用限制。完成这些只需要少于一小时的时间。

安装NVIDIA驱动和nvidia-docker是第二个步骤。我们已经提供了一个简单的脚本来完成这些事情:

$ docker-machine ssh nvidia-docker
$ git clone https://github.com/albarji/neural-style-docker
$ cd neural-style-docker
$ ./scripts/install-nvidia.sh

如果一切顺利,你将会得到以下输出结果:


上面命令仅仅是安装了nvidia软件包,并且输出了GPU卡的信息,以此确保一切正常。

画画之前,你必须闭上眼,轻声吟唱……

毕加索如是说。但在闭上眼之前,我们还有最后一个步骤:部署我们的神奇算法:

$ ./scripts/fake-it.sh goldengate.jpg vangogh.jpg

现在,你只需要下载产生的图片,然后将它们发布在艺术论坛,比如说Devianart,或者将它们展示在本地的艺术馆中:) 从你的电脑运行以下命令:

$ docker-machine scp -r docker-nvidia:/home/ubuntu/neural-style-docker/output .

然后在当前的目录下你就能看到新产生的图片了(在这个例子中,图片的名字是goldengate_by_vangogh.jpg)。


下面是更多的例子:




 

给我一个美术馆……

我将能够填满它,毕加索如是说。现在,我们也能够做到!并且不需要花费一生的时间。我们已经提供了一些风格和内容,因此你只需要坐下来,放轻松,闭上眼,然后轻声吟唱。通过将不同的风格应用在同一幅画上,我们将能够清楚地看到不同的画家是如何用不同的风格来绘制同一个场景或肖像的。

为了表达对Docker的感谢,为了我们生命中的点点滴滴,我们决定开放我们自己的Docker美术馆:


Afremov imagining Docker

Docker was used in the Roman Empire, as this old mosaic proves



 This alleyway depicts an urban graffiti of Docker


A modern dockerized city by Hundertwasser



A classic dockerized city by Renoir




Ancient greek pottery was distributed in containers




Picasso innovated a great deal using Docker




Van Gogh was impressed by Docker




Every math professor knows about the containerability theorem



Docker run potatoes

现在轮到你了。选择你最喜欢的艺术家或者艺术作品,将你自己的图片转换成艺术品。请将你的成果分享给我们!并且关注我们的Twitter(@albarjip and @lherrerabenitez)。

PS:结束创作后,不要忘记停止和删除你的P2实例。

$ docker-machine rm nvidia-docker

我们的艺术馆:

  • http://lherrerabenitez.deviantart.com/gallery/

  • http://albarji.deviantart.com/gallery/60433505/neuralstyle 

机器学习、数据挖掘以及Docker的参考文献

不了解机器学习、数据挖掘和Docker的、并且想要了解它们的朋友,请点击下面的链接:

  • https://arxiv.org/abs/1508.06576 —— A neural algorithm of style

  • http://www.robots.ox.ac.uk/~vgg/publications/2015/Simonyan15/ ——Very Deep Convolutional Networks for Large-Scale Image Recognition (VGG19 network)

  • https://github.com/jcjohnson/neural-style ——A torch implementation of the paper A Neural Algorithm of Artistic Style by Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge.

  • http://image-net.org/challenges/LSVRC/2014/ ——ImageNet 2014 Challenge

  • https://www.coursera.org/learn/machine-learning —— Andrew Ng Machine Learning Course

  • https://github.com/soumith/cvpr2015/blob/master/Deep%20Learning%20with%20Torch.ipynb ——Deep Learning with Torch

  • https://github.com/docker/labs ——Docker Tutorials

  • https://github.com/NVIDIA/nvidia-docker—— NVIDIA Docker

构建和优化Docker镜像

我们想要优化和减少镜像的体积。你能够帮助我们吗?

  • 下载项目:

$ git clone https://github.com/albarji/neural-style-docker
  • 修改项目文件

  • 构建新的镜像:

$ sudo nvidia-docker build -t neural-style:2.0 . 
  • 运行测试代码:

$ sudo nvidia-docker run — rm -v $(pwd):/images — entrypoint python neural-style /neural-style/variants.py — contents img/docker.png — styles img/starryNight.jpg — outfolder


推荐一个培训

【基于Docker的DevOps实战培训 | 南京站】培训内容涉及容器编排框架(应用部署)、Ansible 简介、持续集成常用方式、典型案例分析、容器的选择、架构设计(百万级日活,亿级API 请求)、数据系统构建、持续集成的开发流程等,点击下面图片即可查看具体培训内容。



点击阅读原文链接可直接报名。