TensorFlow API支持Python 2.7和Python 3.3+,共支持4种安装方式。
• Pip install
• Virtualenv install
• Anaconda install
• Docker install
其中大部分支持Linux和Mac OS,由于主要开发环境是Windows,我选择了最为灵活的docker方式安装TensorFlow。TensorFlow还有GPU支持版本,本文仅探索CPU-Only版本。
Docker
其安装步骤可详见 《Docker的安装与基础开发》.
概念
借用Docker官网最大的一行字。
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
从功能上讲,Docker也可以理解为一种虚拟化的方案,可以通过构建包含不同软件的镜像,来达到快速部署开发环境的目的。
再借用官网的一张图,左边蓝色的部分从kernel开始一层层加了debian, emacs, apache形成了一个Image,每一层都是只读的,运行这个Image的时候,上面盖上了一层可读写的Container,做一些编辑和修改,一个简单的服务器就可以用了;又如右边橘红色的部分,Kernel的上面加上了BusyBox就形成了Image,运行起来之后就可以以非常轻量级的方式运行起busybox中支持的命令。再有接下来要学习的TensorFlow镜像,就包含了运行它所需要的全部依赖,简单操作就可以完成TensorFlow开发环境的搭建。
安装
第一步:确认系统版本
首先确认自己的系统是WIN 7或更新的64位系统,且需要支持硬件虚拟化技术。
Win 8及以上查看方法:
Win 7查看方法:
Win 7 运行Microsoft® Hardware-Assisted Virtualization Detection Tool这一工具执行检查。
注:如果查看到未启用硬件虚拟化技术,需要进入BIOS进行设置。
在虚拟机VM里的设置方式如下:
完成之后就可以继续下一步了。
第二步:安装Docker Toolbox
安装过程会安装Docker的各个组件和Oracle VirtualBox,因为Docker需要依赖Linux内核的一些特性,因此Mac和Windows都需要在机器上运行一个小型的Linux系统作为Host系统。如果已经安装过VirtualBox的最新版本,则无需重新安装。
自行选择安装路径,如果已经安装过Git也可以去掉该工具的勾选,VirtualBox也是一样,其它可一路Next。
第三步:测试Docker Toolbox是否安装成功
命令>cmd>键入docker-machine。如果出现想的介绍版本、路径等的信息即可。
配置
安装完成后,建议先配置一个环境变量MACHINE_STORAGE_PATH。
设置完成之后,WIN+R键输入cmd,打开一个windows命令行窗口。
输入此命令:docker-machine create default -d virtualbox
新建一个虚拟机default,使用virtualbox作为driver,这个虚拟机会自动创建在你的MACHINE_STORAGE_PATH配置的目录中,安装过程会从github上拉取boot2docker.iso,可能会比较慢,可以手动下载,也可以直接将toolbox安装目录下的boot2docker.iso复制到%MACHINE_STORAGE_PATH%/cache中。
还要注意过程中可能会出现一些要求Windows执行权限的窗口,有些会最小化在任务栏上,请一一赋予权限。
建立完成之后键入 docker-machine ls
查看刚刚新建的虚拟机。
这时候如果使用的CMD还不能与Docker Engine建立连接,可以通过命令
docker-machine env default
查看如何设置。
键入下面的命令完成环境变量配置
FOR /F "tokens=*" %i IN ('docker-machine env default') DO %i
TensorFlow镜像
下载镜像
命令:
docker pull gcr.io/tensorflow/tensorflow
Tensorflow 是Google的一个开源机器学习框架,中国大陆的用户在使用的时候往往需要爬过GFW墙,借助VPN。
也可以不用从Tensorflow给出的库(Google Cloud Platform)进行pull,而是用docker的库(docker hub)。
命令:
docker pull tensorflow/tensorflow
启动镜像
命令:
docker run –it 8888:8888 tensorflow/tensorflow bash
也可以使用下面的命令将下载和启动镜像结合在一块进行:
docker run -it -p 8888:8888 tensorflow/tensorflow
因为这个镜像比较大,所以会需要一定的时间pull,耐心等待就好。等待完成后便进入了该容器root用户下了。
注意到/目录下的run_jupyter.sh,这事实上是当前版本tensorflow启动的默认命令,也就是说,如果在启动镜像时没有指定bash,就会默认运行这个脚本,这与一些稍早一些版本的tensorflow不同,许多教程中也还没有提到,可能会造成困惑,尝试了一下docker run -it tensorflow/tensorflow,它会启动一个notebook的服务,运行在本地的8888端口上,但这样就想从windows的浏览器上打开notebook是不行的,这与docker本身的机制和运行在虚拟上两个原因有关,如果就想看到notebook,得完成更多必要配置的端口转发部分,本文不做叙述。
接下来,就可以使用TensorFlow工具编写了一个Hello world应用,并输出字符串和进行简单的运算。
从这段简单的代码可以了解到TensorFlow的使用非常方便,通过Python标准库的形式导入,不需要启动额外的服务。第一次接触TensorFlow可能比较疑惑,这段逻辑Python也可以实现,为什么要使用tf.constant()和tf.Session()呢?其实TensorFlow通过Graph和Session来定义运行的模型和训练,这在复杂的模型和分布式训练上有非常大好处。
注:会话Session结束的时候一定要关闭。
TF目录
(1)、目录core
该目录为tensorflow的C++源码的核心存放地点。
以下是对该目录下的几个主要模块(目录)的功能介绍
- 目录common_runtime 该目录下包含了tensorflow中session执行的通用逻辑流程。
- 目录distributed_runtime tensorflow 与分布式相关的执行逻辑。
- 目录graph tensorflow图相关操作的逻辑。由于tensorflow中的数据计算本质上是一个图状结构的计算流程,该过程中存在将图进行切分并且并行化执行的可能性。该目录下的代码逻辑即为对图数据进行结构化定义并进行拆分的相关内容。
- 目录framework 该目录下对tensorflow进行计算过程中的通用组件进行了定义和实现。
- 目录kernels 对tensorflow中各个单步操作的具体实现。 该目录中共有约470个文件,其中414个文件和op相关,该目录下包含了大量的tensorflow中单步操作的实现方式。(如Variable())
- 目录ops 对kernel/ 下的op进行注册和对外声明。
- 目录models 实现了几个tensorflow支持的计算模型,该部分代码由python实现。
- 目录client/public tensorflow对外api的定义和实现
- 目录util/lib 一些公用的调用方法。
- 目录protobuf tensorflow下各个模块间进行数据传输的数据结构定义,通过proto进行配置实现。
- 目录user_ops 用户可进行编写自己的op并添加到该目录。
(2)、目录python
该目录下存放了tensorflow使用python编写的相关代码,个人感觉该部分代码主要是使用python封装了相关的机器学习算法,但最终的计算操作是通过调用目录core 中的C++逻辑实现的。这样做的好处是利用了python较方便的编程特性和C++较高效的执行效率。
(3)、目录tensorboard tensorborad
tensorflow中非常有特色的一个模块,该模块可以用于生成模型训练中实时生成图表,用于监控模型的训练程度。
(4)、目录models
该目录下存放这多个使用pyton实现的模型实例。
(5)、目录contrib
该目录下存放有其他项目贡献者添加的相关贡献代码,由于tensorflow受关注程度较高,目前该目录正急剧膨胀。
其他等等。
相应命令
docker run -i -t (image id/name),以交互模式启动一个容器,会创建一个新的容器。
docker exec [参数] (container id/name) [命令],进入容器执行命令。
docker ps/docker ps –a,查看运行的容器/查看全部的容器。
docker rm (container id/name),删除容器,需要停止容器(或者强制删除)。
docker start/restart (container id/name),启动/重启容器。
docker stop (container id/name)/docker kill (container id/name),停止/杀掉容器。
docker attach (container id/name),进入已启动的容器,而不是每次run image。ctrl+d 退出容器且关闭,ctrl+p+q 退出容器但不关闭。
磁盘映射
磁盘映射是非常有用的一步配置,可以将Windows上的磁盘直接映射到容器中,这样在Windows上开发代码,直接在容器中运行,避免了写完复制的大麻烦。磁盘映射的处理方法与端口转发类似,磁盘的映射关系需要完成Windwos到虚拟机,虚拟机到容器的两步配置,请跟随下面4个步骤:
Windows和虚拟机间的磁盘映射
打开虚拟机的设置页面后,在共享文件夹中设置你想要共享的文件夹和它的名称,如图,重启虚拟机。
Visual BOX 共享文件映射
这一步要用到刚才设置的名称,这里就是docker。
mkdir -p /home/docker/data
mount -t vboxsf -o uid=1000,gid=50 ShareName /home/docker/data
虚拟机和容器间的磁盘映射
使用-v选项,建立两个目录的映射关系
docker run -it -v /home/docker/data:/data tensorflow/tensorflow /bin/bash
好了,试试在Windows的共享文件夹中添加一个python的hello world,然后在docker中python /data/hello.py试试吧
配置启动脚本
用docker-machine创建的虚拟机,它的大部分目录在重启之后都会复原,除了/mnt/sda1,这个目录也就是虚拟机的虚拟磁盘文件disk.vmdk所挂载的位置,可以修改里面的/mnt/sda1/var/lib/boot2docker/profile文件,在文件最后添加自定义的启动命令,比如说添加前面的磁盘映射,就是在profile文件最后加上下面这两句。
mkdir -p /home/docker/data
mount -t vboxsf -o uid=1000,gid=50 ShaneName /home/docker/data
这样每次虚拟机启动就会完成磁盘的挂载了。