一种方案为Haproxy+etcd+confd,采用松散式的组织结构,但各个组件之间的通讯是非常严密的,且扩展性更强,定制也更加灵活。
一、架构优势
约定由Haproxy+etcd+confd+Docker构建的基础服务平台简称“HECD” 架构,整合了多种开源组件,看似松散的结构,事实上已经是一个有机的整体,它们互相联系、互相作用,是Docker生态圈中最理想的组合之一,具有以下优势:
自动、实时发现及无感知服务刷新;
支持任意多台Docker主宿机;
支持多种APP接入且打散至不分主宿机;
采用Etcd存储信息,集群支持可靠性高;
采用Confd配置引擎,支持各类接入层,如Nginx;
支持负载均衡、故障迁移;
具备资源弹性,伸缩自如(通过生成、销毁容器实现);
二、架构说明
在HECD架构中,首先管理员操作Docker Client,除了提交容器(Container)启动与停止指令外,还通过REST-API方式向Etcd(K/V)存储组件注册容器信息,包括容器名称、主宿机IP、映射端口等。Confd配置组件会定时查询Etcd组件获取最新的容器信息,根据定义好的配置模板生成Haproxy配置文件Haproxy.cfg,并且自动reload haproxy服务。用户在访问业务服务时,完全没有感知后端APP的上线、下线、切换及迁移,达到了自动发现、高可用的目的。详细架构图见图1-1。
图1-1 平台架构图
为了方便大家理解各组件间的关系,通过图1-2进行架构流程梳理,首先管理员通过Shell或API操作容器,下一步将容器信息注册到Etcd组件,Confd组件会定时查询Etcd,获取已经注册到Etcd中容器信息,最后通过Confd的模板引擎生成Haproxy配置,整个流程结束。
图1-2架构流程图
了解架构流程后,我们逐一对流程中各组件进行详细介绍。
1、Etcd介绍
Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。
简单:支持 curl 方式的用户 API (HTTP+JSON)。
安全:可选 SSL 客户端证书认证。
快速:单实例可达每秒 1000 次写操作。
可靠:使用 Raft 实现分布式。
2、Confd介绍
Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。
3、Haproxy介绍
HAProxy是提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。(来源百科) 。
三、架构部署
平台环境基于Centos6.5+Docker1.2构建,其中Etcd的版本为etcd version 0.5.0-alpha,Confd版本为confd 0.6.2,Haproxy版本为HA-Proxy version 1.4.24。下面对平台的运行环境、安装部署、组件说明等进行详细说明,环境设备角色表如下:
1、组件安装
1.1 Docker安装
SSH终端登录192.168.1.22服务器,执行以下命令:
# yum -y install docker-io 。
# service docker start 。
# chkconfig docker on 。
1.2 Haproxy、confd安装。
SSH终端登录192.168.1.20服务器,执行以下命令:
1、haproxy
# yum –y install haproxy 。
2、confd
# wget https://github.com/kelseyhightower/confd/releases/download/v0.6.3/confd-0.6.3-linux-amd64 。
# mv confd /usr/local/bin/confd 。
# chmod +x /usr/local/bin/confd 。
# /usr/local/bin/confd -version 。
confd 0.6.2
1.3 Etcd安装
SSH终端登录192.168.1.21服务器,执行以下命令: 。
# yum -y install golang 。
# mkdir -p /home/install && cd /home/install 。
# git clone https://github.com/coreos/etcd 。
# cd etcd
# ./build
# cp bin/etcd /bin/etcd 。
# /bin/etcd -version 。
etcd version 0.5.0-alpha 。
2、组件配置
2.1 Etcd配置
由于etcd是一个轻量级的K/V存储平台,启动时指定相关参数即可,无需配置。
# /bin/etcd -peer-addr 192.168.1.21:7001 -addr 192.168.1.21:4001 -data-dir /data/etcd -peer-bind-addr 0.0.0.0:7001 -bind-addr 0.0.0.0:4001 & 。
由于etcd具备多机支持,参数“-peer-addr”指定与其它节点通讯的地址;参数“-addr”指定服务监听地址;参数“-data-dir”为指定数据存储目录。 。
由于etcd是通过REST-API方式进行交互,常见操作如下:
1) 设置(set) key操作 。
# curl -L http://192.168.1.21:4001/v2/keys/mykey-XPUT -d value="this is awesome" 。
{"action":"set","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 。
2) 获取(get) key信息。
# curl -L http://192.168.1.21:4001/v2/keys/mykey 。
{"action":"get","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 。
3) 删除key信息
# curl -L http://192.168.1.21:4001/v2/keys/mykey-XDELETE {"action":"delete","node":{"key":"/mykey","modifiedIndex":29,"createdIndex":28},"prevNode":{"key":"/mykey","value":"this is awesome","modifiedIndex":28,"createdIndex":28}} 更多操作API见https://github.com/coreos/etcd/blob/master/Documentation/api.md。 。
2.2 Confd+Haproxy配置。
由于Haproxy的配置文件是由Confd组件生成,要求Confd务必要与haproxy安装在同一台主机上,Confd的配置有两种,一种为Confd资源配置文件,默认路径为“/etc/confd/conf.d”目录,另一种为配置模板文件,默认路径为“/etc/confd/templates”。具体配置如下:
创建配置文件目录
# mkdir -p /etc/confd/{conf.d,templates}。
(1)配置资源文件
详细见以下配置文件,其中“src”为指定模板文件名称(默认到路径/etc/confd/templates中查找);“dest”指定生成的Haproxy配置文件路径;“keys”指定关联Etcd中key的URI列表;“reload_cmd”指定服务重载的命令,本例中配置成haproxy的reload命令。
【/etc/confd/conf.d/ haproxy.toml】 。
[template]
src = "haproxy.cfg.tmpl" 。
dest = "/etc/haproxy/haproxy.cfg" 。
keys = [
"/app/servers", 。
]
reload_cmd = "/etc/init.d/haproxy reload" 。
(2)配置模板文件
Confd模板引擎采用了Go语言的文本模板,更多见http://golang.org/pkg/text/template/,具备简单的逻辑语法,包括循环体、处理函数等,本示例的模板文件如下,通过range循环输出Key及Value信息。
【/etc/confd/templates/haproxy.cfg.tmpl】 。
global
log 127.0.0.1 local3 。
maxconn 5000 。
uid 99 。
gid 99 。
daemon 。
defaults
log 127.0.0.1 local3 。
mode http 。
option dontlognull 。
retries 3 。
option redispatch 。
maxconn 2000 。
contimeout 5000 。
clitimeout 50000 。
srvtimeout 50000 。
listen frontend 0.0.0.0:80 。
mode http 。
balance roundrobin 。
maxconn 2000 。
option forwardfor 。
{{range gets "/app/servers/*"}} 。
server {{base .Key}} {{.Value}} check inter 5000 fall 1 rise 2 。
{{end}} 。
stats enable 。
stats uri /admin-status 。
stats auth admin:123456 。
stats admin if TRUE 。
(3)模板引擎说明
本小节详细说明Confd模板引擎基础语法与示例,下面为示例用到的KEY信息。
# curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/backstabbing_rosalind-d value="192.168.1.22:49156" 。
# curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/cocky_morse-d value="192.168.1.22:49158" 。
# curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/goofy_goldstine-d value="192.168.1.22:49160" 。
# curl -XPUT http://192.168.1.21:4001/v2/keys/app/servers/prickly_blackwell-d value="192.168.1.22:49162"1、base 。
作为path.Base函数的别名,获取路径最后一段。 。
{{ with get "/app/servers/prickly_blackwell"}}。
server {{base .Key}} {{.Value}} check 。
{{end}}
prickly_blackwell 192.168.1.22:49162。
2、get
返回一对匹配的KV,找不到则返回错误。
{{with get "/app/servers/prickly_blackwell"}}。
key: {{.Key}}
value: {{.Value}} 。
{{end}}
/app/servers/prickly_blackwell 192.168.1.22:49162 。
3、gets
{{range gets "/app/servers/*"}}。
{{.Key}} {{.Value}}。
{{end}}
/app/servers/backstabbing_rosalind 192.168.1.22:49156 。
/app/servers/cocky_morse 192.168.1.22:49158 。
/app/servers/goofy_goldstine 192.168.1.22:49160 。
app/servers/prickly_blackwell 192.168.1.22:49162。
4、getv
返回一个匹配key的字符串型Value,找不到则返回错误。
{{getv "/app/servers/cocky_morse"}}。
192.168.1.22:49158 。
5、getvs
返回所有匹配key的字符串型Value,找不到则返回错误。
{{range getvs "/app/servers/*"}}。
value: {{.}}
{{end}}
value: 192.168.1.22:49156 。
value: 192.168.1.22:49158 。
value: 192.168.1.22:49160 。
value: 192.168.1.22:49162 。
6、split
对输入的字符串做split处理,即将字符串按指定分隔符拆分成数组。
{{ $url := split (getv "/app/servers/cocky_morse") ":" }}。
host: {{index $url 0}}。
port: {{index $url 1}}。
host: 192.168.1.22 。
port: 49158
7、ls
返回所有的字符串型子key,找不到则返回错误。 。
{{range ls "/app/servers/"}}。
subkey: {{.}}
{{end}}
subkey: backstabbing_rosalind 。
subkey: cocky_morse 。
subkey: goofy_goldstine 。
subkey: prickly_blackwell 。
8、lsdir
返回所有的字符串型子目录,找不到则返回一个空列表。 。
{{range lsdir "/app/"}}。
subdir: {{.}}
{{end}}
subdir: servers。
(4)启动confd及haproxy服务。
下面为启动Confd服务命令行,参数“interval”为指定探测etcd的频率,单位为秒,参数“-node”为指定etcd监听服务主地址,以便获取容器信息。 。
# /usr/local/bin/confd -verbose -interval 10 -node '192.168.1.21:4001' -confdir /etc/confd > /var/log/confd.log & 。
# /etc/init.d/haproxy start 。
不久之前,机器之心联合百度推出 PaddlePaddle 专栏,为想要学习这一平台的技术人员推荐相关教程与资源。在解析过PaddlePaddle框架之后,从这篇文章开始上手,安装 PaddlePaddle。
目录
环境
Windows 系统的安装
在 Windows 上安装 Docker 容器在 Windows 上安装 Ubuntu。
使用 pip 安装
使用 Docker 安装
从源码编译生成安装包
在本地编译生成安装包在 Docker 编译生成安装包。
编译 Docker 镜像
测试安装环境
最后提示
项目代码
参考资料
环境
系统:Ubuntu 16.0.4(64 位)处理器:Intel(R) Celeron(R) CPU内存:8G。
Windows 系统的安装
PaddlePaddle 目前还不支持 Windows,如果读者直接在 Windows 上安装 PaddlePaddlePaddle 的话,就会提示没有找到该安装包。如果读者一定要在 Windows 上工作的话,笔者提供两个建议:一、在 Windows 系统上使用 Docker 容器,在 Docker 容器上安装带有 PaddlePaddle 的镜像;二、在 Windows 系统上安装虚拟机,再在虚拟机上安装 Ubuntu。
在 Windows 上安装 Docker 容器。
首先下载 Docker 容器的工具包 DockerToolbox,笔者使用这个安装包不仅仅只有 Docker,它还包含了 VirtualBox 虚拟机,使用者工具包我们就不用单独去安装 VirtualBox 虚拟机了,DockerToolbox 的官网下载地址:https://docs.docker.com/toolbox/toolbox_install_windows/。
下载之后,就可以直接安装了,双击安装包,开始安装。
选择安装路径,笔者使用默认的安装路径。
然后安装所依赖的软件,因为笔者之前在电脑上已经安装了 git,所以在这里就不安装了,其他都要勾选。
这一步不用修改什么,让程序为我们创建一个桌面快捷键。
最后就可以安装了,等待一小段时间即可。
到这里就安装完成了
安装完成之后,如果直接启动 Docker 的话,有可能可能会卡在这里,因为还有下载一个 boot2docker.iso 镜像,网速比较慢的话就可能一直卡在这里。所以我们还要镜像下一步操作。
Running pre-create checks...。
(default) No default Boot2Docker ISO found locally, downloading the latest release...。
(default) Latest release for github.com/boot2docker/boot2docker is v17.12.1-ce。
(default) Downloading C:\Users\15696\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.12.1-ce/boot2docker.iso...。
在下载 DockerToolbox 的时候,这个工具就已经带有 boot2docker.iso 镜像了。并且存在 DockerToolbox 安装的路径上,笔者的路径是:
C:\Program Files\Docker Toolbox\boot2docker.iso。
我们把这个镜像复制到用户目录\.docker\machine\cache\,如笔者的目录如下:
C:\Users\15696\.docker\machine\cache\。
复制完成之后,双击桌面快捷方式 Docker Quickstart Terminal,启动 Docker,命令窗口会输出以下信息:
Running pre-create checks...。
Creating machine...。
(default) Copying C:\Users\15696\.docker\machine\cache\boot2docker.iso to C:\Users\15696\.docker\machine\machines\default\boot2docker.iso...。
(default) Creating VirtualBox VM...。
(default) Creating SSH key...。
(default) Starting the VM...。
(default) Check network to re-create if needed...。
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.。
(default) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #3"。
(default) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.。
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.。
(default) Waiting for an IP...。
最后看到 Docker 的 logo 就表示成功安装 Docker 容器了。
## .
## ## ## ==
## ## ## ## ## ===。
/"""""""""""""""""\___/ ===。
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~。
\______ o __/
\ \ __/
\____\_______/
docker is configured to use the default machine with IP 192.168.99.100。
For help getting started, check out the docs at https://docs.docker.com。
Start interactive shell。
15696@ MINGW64 ~。
到这就可以使用 Docker 来安装 PaddlePaddle 了,具体请看本文章中关于 Docker 使用 PaddlePaddle 部分。
在 Windows 上安装 Ubuntu。
在 Windows 上在 Ubuntu 就要先安装虚拟机,虚拟机有很多,笔者使用的是开源的 VirtualBox 虚拟机,VirtualBox 的官网:https://www.virtualbox.org/。
安装完成 VirtualBox 虚拟机之后,进入到 VirtualBox 虚拟机中点击新建,创建一个系统。
选择分配的内存,我这里只是分配了 2G,如果正式使用 PaddlePaddle 训练模型,这远远不够,读者可以根据需求分配内存。
创建一个虚拟硬盘
选择默认的 VDI 硬盘文件类型。
这里最好是选择动态分配硬盘,这样虚拟机会根据实际占用的空间大小使用电脑本身的磁盘大小,这样会减少电脑空间的占用率的。如果是固定大小,那么创建的虚拟机的虚拟硬盘一开始就是用户设置的大小了。
这里就是选择虚拟硬盘大小的,最后分配 20G 以上,笔者分配 30G,应该够用。
然后选择刚才创建的 Ubuntu 系统,点击设置,这系统中取消勾选软驱,然后点击存储,选择 Ubuntu 镜像,笔者使用的是 64 位 Ubuntu 16.04 桌面版的镜像。
最后就可以启动安装 Ubuntu 了。选择我们创建的 Ubuntu 系统,点击启动,进入到开始安装界面,为了方便使用,笔者选择中文版的。
为了安装之后不用在安装和更新应用,笔者勾选了安装 Ubuntu 时下载更新,这样在安装的时候就已经更新应用了。
然后是选安装的硬盘,因为我们使用的自己创建的整一个硬盘,所以我们可以直接选择青春整个硬盘并安装 Ubuntu,这里就不用考虑分区和挂载问题了。
选择所在的位置,这没什么要求的,笔者随便选择一个城市。
然后是选择键盘的布局,通常的键盘布局都是英语(美国)
创建 Ubuntu 的用户名称和密码。
最后就是安装了,这个安装过程可能有点久,耐心等待。
安装完成之后就可以在 Windows 系统上使用 Ubuntu 系统了,我们再使用 Ubuntu 来学习和使用 PaddlePaddle 做深度学习了。最好安装完成之后,把在存储中设置的 Ubuntu 镜像移除。
在本篇文章之后部分都是在 Ubuntu 上操作,我们都可以使用 Ubuntu 这虚拟机来完成。
如果读者使用的是 Windows 10,可以使用 Windows 系统自带的 Linux 子系统,安装教程可以看我之前的文章 Windows10 安装 Linux 子系统。
使用 pip 安装
如果你还没有在 pip 命令的话,首先要安装 pip,要确保安装的 pip 版本是大于 9.0.0 的,否则可能无法安装 paddlepaddle。
安装 pip 命令如下:
sudo apt install python-pip。
安装之后,还有看一下 pip 的的版本 pip --version,如果版本低于 9.0.0,那要先升级 pip,先要下载一个升级文件,命令如下:
wget https://bootstrap.pypa.io/get-pip.py。
下载完成之后,可以使用这个文件安装最新的 pip 了。
python get-pip.py。
安装 pip 就可以动手安装 paddlepaddle 了。如果权限不够,请在 root 下执行命令。
pip install paddlepaddle。
现在就测试看看 paddlepaddle 有没有,在 python 的命令终端中试着导入 paddlepaddle 包:
import paddle.v2 as paddle。
如果没有报错的话就证明 paddlepaddle 安装成功了。
使用 Docker 安装
为什么要使用 Docker 安装 paddlepaddle 呢,Docker 是完全使用沙箱机制的一个容器,在这个容器安装的环境是不会影响到本身系统的环境的。通俗来说,它就是一个虚拟机,但是它本身的性能开销很小。在使用 Docker 安装 paddlepaddle 前,首先要安装 Docker,通过下面的命令就可以安装了:
sudo apt-get install docker。
安装完成之后,可以使用 docker --version 查看 Docker 的版本,如果有显示,就证明安装成功了。可以使用 docker images 查看已经安装的镜像。
一切都没有问题之后,就可以用 Docker 安装 paddlepaddle 了,命令如下:
docker pull docker.paddlepaddlehub.com/paddle。
在这里不得不说的是,这个安装过程非常久,也许是笔者的带宽太小了。安装完成后,可以再使用 docker images 命令查看安装的镜像,应该可以 看到类似这样一个镜像,名字和 TAG 会相同,其他信息一般不同。
docker.paddlepaddlehub.com/paddle latest 2b1ae16d846e 27 hours ago 1.338 GB。
从源码编译生成安装包
我们的硬件环境都有很大的不同,官方给出的 pip 安装包不一定是符合我们的需求,比如笔者的电脑是不支持 AVX 指令集的,在官方中没找到这个的安装包(也行现在已经有了),所以我们要根据自己的需求来打包一个自己的安装包。
在本地编译生成安装包
1. 安装依赖环境
在一切开始之前,先要安装好依赖环境,下面表格是官方给出的依赖环境。
1.1 安装 GCC
一般现在的 Ubuntu 都是高于个版本了,可以使用 gcc --version 查看安装的版本。比如笔者的是 4.8.4,如果你的是版本是低于 4.8.2 的就要更新一下了。
sudo apt-get install gcc-4.9。
1.2 安装 CMake
先要从官网下 CMake 源码。
wget https://cmake.org/files/v3.8/cmake-3.8.0.tar.gz。
解压源码
tar -zxvf cmake-3.8.0.tar.gz。
依次执行下面的代码
# 进入解压后的目录
cd cmake-3.8.0
# 执行当前目录的 bootstrap 程序。
./bootstrap
# make 一下
make
# 开始安装
sudo make install。
查看是否安装成功,cmake --version,如果正常显示版本,那已经安装成功了。
1.3 安装 pip
关于安装 pip9.0.0 以上的版本,在上面的使用 pip 安装部分已经讲了,这里就不在熬述了。
1.4 安装 numpy
安装 numpy 很简单,一条命令就够了。
sudo apt-get install python-numpy。
顺便多说一点,matplotlib 这个包也经常用到,顺便安装一下。
sudo apt-get install python-matplotlib。
1.5 安装 SWIG
执行下面代码安装 SWIG,安装成功之后,使用 swig -version 检查安装结果。
sudo apt-get install -y git curl gfortran make build-essential automake swig libboost-all-dev。
1.6 安装 Go
官方说可选择,那看情况吧,如果像安装安装吧,笔者顺便安装了,就一条代码的事情,老规则 go version。
sudo apt-get install golang。
到这里,依赖环境就已经安装好了,准备安装 paddlepaddle。
2. 首先要在 GitHub 上获取 paddlepaddle 源码。
git clone https://github.com/PaddlePaddle/Paddle.git。
3. 然后输以下命令
# 进入刚下载的 Paddle 里面。
cd Paddle
# 创建一个 build 文件夹。
mkdir build
# 进入 build 文件夹里。
cd build
# 这就要选好你的需求了,比如笔者没有使用 GPU,不支持 AVX,为了节省空间,我把测试关闭了,这样会少很多空间。最后不要少了..。
cmake .. -DWITH_GPU=OFF -DWITH_AVX=OFF -DWITH_TESTING=OFF。
# 最后 make,生成你想要的安装包,这个可能很久, 一定要有耐心。
make
经过长久的 make 之后,终于生成了我们想要的安装包,它的路径在 Paddle/build/python/dist 下,比如笔者在该目录下有这个安装包 paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl,你的命名可能不是这个。之后就可以安装了,使用 pip 安装:
# 请切入到该目录
cd build/python/dist/。
# 每个人的安装包名字可能不一样。如果权限不够,请在 root 下执行命令。
pip install paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl。
这个我们就已经安装了 paddlepaddle,现在就测试看看 paddlepaddle 有没有安装成功了,在 python 的命令终端中试着导入 paddlepaddle 包:
import paddle.v2 as paddle。
如果没有报错的话就证明 paddlepaddle 安装成功了。
在 Docker 编译生成安装包。
使用 Docker 就轻松很多了,有多轻松,看一下便知 。
1. 首先要在 GitHub 上获取 paddlepaddle 源码。
git clone https://github.com/PaddlePaddle/Paddle.git。
2. 切入到项目的根目录下
cd Paddle
3. 生成安装包
下面一行代码,提醒一下,这个过程非常长,一定要有耐心,顺便把编译测试关了,减少空间。
docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_AVX=OFF" -e "-DWITH_TESTING=OFF" docker.paddlepaddlehub.com/paddle:latest-dev bash -x /paddle/paddle/scripts/docker/build.sh。
同样会在 Paddle/build/python/dist 下生成一个安装包,这对比在本地生成的安装包,是不是要简单很多,没错这就是 Docker 强大之处,所有的依赖环境都帮我们安装好了,现在只要安装这个安装包就行了:
# 请切入到该目录
cd build/python/dist/。
# 每个人的安装包名字可能不一样。如果权限不够,请在 root 下执行命令。
pip install paddlepaddle-0.11.0-cp27-cp27mu-linux_x86_64.whl。
同样我们要测试看看 paddlepaddle 有没有安装成功了,在 python 的命令终端中试着导入 paddlepaddle 包:
import paddle.v2 as paddle。
如果没有报错的话就证明 paddlepaddle 安装成功了。
编译 Docker 镜像
如果你比较喜欢使用 Docker 来运行你的 paddlepaddle 代码,但是有没有你想要的镜像,这是就要自己来制作一个 Docker 镜像了,比如笔者的电脑是不支持 AVX 指令集的,还只有 CPU,那么我就要一个不用 AVX 指令集和使用 CPU 训练的镜像。好吧,我们开始吧。
1. 我们要从 GitHub 下载源码:
git clone https://github.com/PaddlePaddle/Paddle.git。
2. 安装开发工具到 Docker image 里。
# 切入到 Paddle 目录下。
cd Paddle
# 下载依赖环境并创建镜像,别少了最后的.。
docker build -t paddle:dev .。
有可能它不能够命名为 paddle:dev,我们可以对他从重新命名,ID 要是你镜像的 ID。
# docker tag <镜像对应的 ID> <镜像名:TAG>。
例如:docker tag 1e835127cf33 paddle:dev。
3. 编译
# 这个编译要很久的,请耐心等待。
docker run --rm -e WITH_GPU=OFF -e WITH_AVX=OFF -v $PWD:/paddle paddle:dev。
安装完成之后,使用 docker images 查看刚才安装的镜像。
测试安装环境
我们就使用官方给出的一个例子,来测试我们安装 paddlepaddle 真的安装成功了。
1. 创建一个记事本,命名为 housing.py,并输入以下代码:
import paddle.v2 as paddle。
# Initialize PaddlePaddle.。
paddle.init(use_gpu=False, trainer_count=1)。
# Configure the neural network.。
x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(13))。
y_predict = paddle.layer.fc(input=x, size=1, act=paddle.activation.Linear())。
# Infer using provided test data.。
probs = paddle.infer(。
output_layer=y_predict,。
parameters=paddle.dataset.uci_housing.model(),。
input=[item for item in paddle.dataset.uci_housing.test()()])。
for i in xrange(len(probs)):。
print 'Predicted price: ${:,.2f}'.format(probs[i][0] * 1000)。
2. 执行一下该代码
在本地执行代码请输入下面的命令。
python housing.py。
在 Docker 上执行代码的请输入下面的代码。
docker run -v $PWD:/work -w /work -p 8899:8899 docker.paddlepaddle.org/paddle python housing.py。
-v 命令是把本地目录挂载到 docker 镜像的目录上,-w 设置该目录为工作目录,-p 设置端口号,使用到的镜像是在使用 Docker 安装部分安装的镜像 docker.paddlepaddle.org/paddle。
3. 终端会输出下面类似的日志。
I0116 08:40:12.004096 1 Util.cpp:166] commandline: --use_gpu=False --trainer_count=1。
Cache file /root/.cache/paddle/dataset/fit_a_line.tar/fit_a_line.tar not found, downloading https://github.com/PaddlePaddle/book/raw/develop/01.fit_a_line/fit_a_line.tar。
[==================================================]。
Cache file /root/.cache/paddle/dataset/uci_housing/housing.data not found, downloading https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data。
[==================================================]。
Predicted price: $12,316.63。
Predicted price: $13,830.34。
Predicted price: $11,499.34。
Predicted price: $17,395.05。
Predicted price: $13,317.67。
Predicted price: $16,834.08。
Predicted price: $16,632.04。
如果没有成功运行该代码,报错信息如下,说明安装的 paddlepaddle 版本过低,请安装高版本的 paddlepaddle。
I0116 13:53:48.957136 15297 Util.cpp:166] commandline: --use_gpu=False --trainer_count=1。
Traceback (most recent call last):。
File "housing.py", line 13, in <module>。
parameters=paddle.dataset.uci_housing.model(),。
AttributeError: 'module' object has no attribute 'model'。
最后提示
有很多学习者会出现明明安装完成 PaddlePaddle 了,但是在 PaddlePaddle 的时候,在初始化 PaddlePaddle 这一行代码出错。
paddle.init(use_gpu=False, trainer_count=1)。
这个多数是读者的电脑不支持 AVX 指令集,而在 PaddlePaddle 的时候,安装的是支持 AVX 指令集的版本,所以导致在初始化 PaddlePaddle 的时候报错。所以在安装或者编译 PaddlePaddle 安装包时,要根据读者电脑本身的情况,选择是否支持 AVX 指令集。查看电脑是否支持 AVX 指令集,可以在终端输入以下命令,输出 Yes 表示支持,输出 No 表示不支持。
if cat /proc/cpuinfo | grep -i avx; then echo Yes; else echo No; fi。
项目代码
GitHub 地址:https://github.com/yeyupiaoling/LearnPaddle。
参考资料
http://paddlepaddle.org/。
https://pip.pypa.io/en/stable/。
http://www.runoob.com/。
http://www.linuxidc.com/Linux/2016-12/138489.htm。
https://www.jianshu.com/p/c6264cd5f5c7。
no such file or directory 意思是: 没用这样的文件和文件夹。
解决方法:
1.查一下 文件名 和 路径的 拼写 有无错误。
2.cp 是 copy 的意思 (linux/unix 文件复制 命令)。
“No such file or directory”一般是没有找到文件的位置,你应该在属性中将它找不到的文件的路径添加到包含目录那一列里。
1.具体做法为:点击菜单“项目”-“属性”。
2.在弹出的属性对话框中选择“常规”,在“附加包含目录”处添加它找不到的文件的路径。
3.看你的代码没有任何错误。 同时,建议你将scanf("%f\n",&r)里的\n去掉。改成scanf("%f",&r);。
开源Docker仓库v2 的其中一个最新特性:能够被用作代理缓存仓库,以缓存Docker Hub上的镜像。运行一个缓存仓库允许你在本地储存镜像,减少过多的通过互联网从Docker Hub拉取镜像,这个特性对于一些在他们环境中拥有数量庞大的Docker引擎的用户来说很有用。跟着本篇教程,你可以让Docker引擎从本地代理缓存仓库拉取镜像,而不是让每个引擎总是从Docker Hub拉取,从而节省时间和带宽。
你可以这样开始:
####要求:
- Docker引擎1.8.3。
- Docker仓库v2
- 足够储存Docker镜像的磁盘空间。
- TLS证书和密钥
持久化数据
在这个例子中,我们会假设你会储存所有持久化数据在本地文件系统的<code>/data</code>路径下,这个路径下包含TLS证书和密钥文件,配置文件和镜像缓存文件。我们之后会用卷挂载这个目录进运行仓库的容器。
保护你的代理缓存仓库安全
代理缓存仓库需要一个TLS证书来保证Docker引擎和缓存仓库之间的连接安全,在这个例子中,我们会放置我们证书文件(<code>domain.crt</code>)和密钥文件(<code>domain.key</code>)在主机的<code>/data</code>目录。
更多关于使用TLS加强仓库安全的信息,请参照 Docker仓库2.0文档 。
创建代理缓存仓库配置文件
下一步你需要创建一个配置文件,来把这个仓库用作代理缓存。你可以用cat命令把<code>registry:2</code>镜像中的缺省配置文件重定向输出到一个文件中:
sh
$ docker run -it --rm --entrypoint cat registry:2 \。
/etc/docker/registry/config.yml > /data/config.yml 。
<code>我强烈建议从Docker镜像中获得这个默认配置,而不是使用例子中的配置,因为将来这个默认配置可能会有更新。</code>。
默认的config.yml例子:
yaml
version: 0.1
log:
fields
service: registry。
storage:
cache:
layerinfo: inmemory。
filesystem:
rootdirectory: /var/lib/registry。
http:
addr: :5000
修改'http'这节配置上TLS:。
yaml
http:
addr: :5000
tls:
certificate: /var/lib/registry/domain.crt。
key: /var/lib/registry/domain.key 。
在配置文件中新加一节'proxy'来开启缓存:
点击打开文档( https://github.com/docker/dist ... or.md )
yaml
proxy:
remoteurl: https://registry-1.docker.io。
username: [username]。
password: [password] 。
'username'和'password'这两个选项是可选的,这是Docker Hub账号的用户名和密码,设置上这两个选项,会使代理缓存仓库获取到这个账号的同等权限,也就是说,这个用户有权限获取的镜像,这个缓存仓库同样有权限获取。
<code>请确保完全理解设置这个Docker Hub账号背后意味着什么,并且确保你镜像的安全还有严格的访问权限!如果你不确定,请不要再配置包含用户名和密码,那么你的代理缓存仓库就只会缓存公共镜像。</code>。
启动代理缓存仓库的容器:
sh
$ docker run -d --restart=always -p 5000:5000 --name v2-mirror \。
-v /data:/var/lib/registry registry:2 /var/lib/registry/config.yml 。
以上命令使用一个卷把宿主机上的/data挂载进了容器中,使容器能使用持久储存镜像缓存,TLS证书和密钥,还有自定义的仓库配置文件。
验证你的代理缓存仓库已经启动并正常运行:
sh
$ curl -I https://mycache.example.com:5000/v2/。
HTTP/1.1 200 OK。
Content-Length: 2。
Content-Type: application/json; charset=utf-8。
Docker-Distribution-Api-Version: registry/2.0。
Date: Thu, 17 Sep 2015 21:42:02 GMT 。
配置你的Docker引擎使用代理缓存仓库。
修改Docker守护进程的启动参数,加上<code>--registry-mirror</code>选项:
sh
--registry-mirror=https://<my-docker-mirror-host>:<port-number> 。
例如,如果你的缓存仓库的主机名为mycache.example.com并且仓库服务端口为5000,你需要加上以下选项到守护进程的参数:
sh
--registry-mirror=https://mycache.example.com:5000 。
参考 在各种的Linux分发版中配置运行Docker 了解更多信息关于如何添加Docker守护进程参数。
测试你的代理缓存仓库
从Docker Hub上拉取一个你本地没有的镜像。例如,busybox:latest镜像:
sh
$ docker pull busybox:latest 。
检查缓存仓库中的目录,验证busybox镜像是否被缓存:
sh
$ curl https://mycache.example.com:5000/v2/_catalog。
{"repositories":["library/busybox"]} 。
你也可以验证latest标签是否被缓存:
sh
$ curl https://mycache.example.com:5000/v2/library/busybox/tags/list。
{"name":"library/busybox","tags":["latest"]} 。
现在开始当你拉取镜像时,镜像将被缓存到你的代理缓存仓库,之后拉取相同的镜像时会更快,并且这些镜像缓存会维护自身,当他们不再被使用时将会自动清除。
在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛。为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有: 网易 、 USTC 、 DaoCloud 、 阿里云 。
现在 Docker 官方针对中国区推出了镜像加速服务。通过 Docker 官方镜像加速,国内用户能够以更快的下载速度和更强的稳定性访问最流行的 Docker 镜像。
如何使用官方镜像
Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问。目前该镜像库只包含流行的公有镜像,而私有镜像仍需要从美国镜像库中拉取。
您可以使用以下命令直接从该镜像加速地址进行拉取。
$ docker pull registry.docker-cn.com/myname/myrepo:mytag。
例如:
$ docker pull registry.docker-cn.com/library/ubuntu:16.04。
注:除非您修改了Docker守护进程的–registry-mirror参数,否则您将需要完整地指定官方镜像的名称。例如,library/ubuntu、library/redis、library/nginx。
给Docker守护进程配置加速器。
如果要配置 Docker 守护进程默认使用 Docker 官方镜像加速。您可以在 Docker 守护进程启动时配置 --registry-mirror 参数。
通过命令行启动Docker
$ docker --registry-mirror=https://registry.docker-cn.com daemon。
通过配置文件启动Docker
Docker 版本在 1.12 或更高。
修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。
$ vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"]}。
Docker版本在 1.8 与 1.11 之间。
您可以找到 Docker 配置文件,在配置文件中的 DOCKER_OPTS 加入。不同的 Linux 发行版的配置路径不同,这里以 Ubuntu 为例。
a) Ubuntu 14.04版本。
修改 /etc/default/docker 文件,加入如下参数。
$ vim /etc/default/docker DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"。
b) Ubuntu 15.04以后版本。
Ubuntu 15.04 之后默认使用了 Systemd 管理服务,加速器配置方式稍有些不同。在 Systemd 服务文件中加入启动参数。
$ vim /lib/systemd/system/docker.service [Service] ExecStart=/usr/bin/docker -d -H fd:// --registry-mirror=https://registry.docker-cn.com。
修改保存后,重启 Docker 以使配置生效。
$ service docker restart。
给Docker守护进程配置加速器后,就可以默认通过官方镜像加速拉取镜像,而无需在每次拉取时指定 registry.docker-cn.com 。
原文地址:http://www.qianchusai.com/docker%E5%AE%89%E8%A3%85v2ray.html