一、介绍
TensorFlow 是一个流行的开源机器学习平台,可帮助用户实现深度学习和机器学习模型来解决常见的业务问题。TensorFlow为开发人员和企业提供了一个生态系统,以构建可扩展的机器学习应用程序。例如,它用于训练称为有状态数据流图的神经网络,其中每个图节点表示神经网络操作或多维数组。
本文演示了使用官方 Docker 镜像和 NVIDIA Docker 工具包部署临时或持久 TensorFlow 工作区的步骤。
二、准备工作
在开始之前,您应该:
- 使用 NVIDIA NGC Marketplace Application 部署 Vultr Cloud GPU 执行。
- 使用记录将子域指向您的服务器。本文使用 tensorflow.example.com 进行演示。
A
三、验证 GPU 可用性
Vultr Cloud GPU 服务器具有用于机器学习、人工智能等的 NVIDIA GPU。它们带有许可的 NVIDIA 驱动程序和 CUDA 工具包,这对于 GPU 的正常运行至关重要。本部分演示验证服务器和容器内的 GPU 可用性的步骤。
在服务器上执行命令。nvidia-smi
# nvidia-smi
上述命令输出有关连接的 GPU 的信息。它包括驱动程序版本、CUDA 版本、GPU 型号、可用内存、GPU 使用情况等信息。
在容器内执行命令。nvidia-smi
# docker run --rm --gpus all nvidia/cuda:10.2-base nvidia-smi
上面的命令使用官方镜像来验证容器内的 GPU 访问。NVIDIA Docker Toolkit 使您能够使用该选项在容器内使用 GPU。容器结束后,该选项将从磁盘中删除容器。nvidia/cuda
--gpus
--rm
四、部署临时工作区
Vultr 云 GPU 服务器提供对高端 GPU 的访问,您可以利用这些 GPU 来训练机器学习模型,无需支付硬件的前期成本即可节省大量时间。本节介绍在 Vultr 云 GPU 服务器上部署临时 TensorFlow 工作区的步骤。
禁用防火墙。
# ufw disable
上述命令禁用防火墙以允许所有端口上的入站连接。
部署新的 Docker 容器。
# docker run -p 8888:8888 --gpus all -it --rm -v /root/notebooks:/tf/notebooks tensorflow/tensorflow:latest-gpu-jupyter
上面的命令使用带有包含 GPU 加速 TensorFlow 环境和 Jupyter 笔记本服务器的标签的官方图像。从此命令的输出中复制令牌以访问 Jupyter 笔记本界面。tensorflow/tensorflow
latest-gpu-jupyter
以下是上述命令中使用的每个参数的说明。
-p 8888:8888
:在端口 上公开连接。8888
--gpus all
:容器内的 GPU 访问权限。-it
:交互式会话。允许键盘中断。--rm
:停止时取出容器。-v /root/notebooks:/tf/notebooks
:将所有笔记本存储在目录中。/root/notebooks
使用 TensorFlow 模块验证 GPU 的可用性。
- 在 Web 浏览器中打开并使用复制的令牌登录到界面。
http://PUBLIC_IP:8888
- 在 Jupyter 笔记本界面中,导航到要在其中创建新笔记本的目录。
- 点击界面右上角的“新建”按钮,从下拉菜单中选择“Python 3”选项。这将在所选目录中创建新的 Python 3 笔记本。
- 通过单击页面顶部的“无标题”标题并键入新名称,为笔记本命名。
- 要添加新单元格,请单击界面顶部的“插入”菜单,然后选择“在下面插入单元格”选项。然后,您可以在单元格中输入代码并通过单击页面顶部工具栏中的“运行”按钮或按 + 来运行它。SHIFTENTER
在新单元格中运行以下代码。
import tensorflow as tf
tf.config.list_physical_devices()
输出。
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'),
PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
输出确认 GPU 在 TensorFlow 模块中可用。您可以通过打开终端窗口并按 + 来停止工作区。停止容器不会删除笔记本。您可以在目录中找到它们。CTRLC/root/notebooks
五、部署持久工作区
在 Vultr Cloud GPU 服务器上部署 TensorFlow 工作区提供的不仅仅是对高端 GPU 的访问。Jupyter 笔记本界面允许您与其他人一起处理机器学习项目,提供比本地设置更大的灵活性和可扩展性。它还允许您通过互联网连接从任何地方访问和管理您的机器学习资源。本节演示了使用 Docker Compose 在 Vultr Cloud GPU 服务器上部署持久 TensorFlow 工作区的步骤。
创建并输入一个名为 的新目录。tensorflow-workspace
# mkdir ~/tensorflow-workspace
# cd ~/tensorflow-workspace
上述命令创建并输入目录中名为的新目录。您可以使用此目录存储与 TensorFlow 工作区相关的所有配置文件,例如 Nginx 配置、SSL 证书等。tensorflow-workspace
/root
创建一个名为 的新文件 。docker-compose.yaml
# nano docker-compose.yaml
将以下内容添加到文件中。
services:
jupyter:
image: tensorflow/tensorflow:latest-gpu-jupyter
restart: unless-stopped
volumes:
- "/root/notebooks:/tf/notebooks"
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
nginx:
image: nginx
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/dhparam.pem:/etc/ssl/certs/dhparam.pem
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
command: certonly --webroot -w /var/www/certbot --force-renewal --email YOUR_EMAIL -d tensorflow.example.com --agree-tos
上述配置定义了三个服务。该服务运行包含 GPU 加速 TensorFlow 工作区的容器,并使用该属性来存储目录中的所有笔记本。该服务使用官方 Nginx 映像运行容器,该容器充当客户端和服务之间的反向代理服务器。该服务使用官方 Certbot 映像运行容器,该映像为指定域名颁发 Let’s Encrypt SSL 证书。替换为您的电子邮件地址。jupyter
volumes
/root/notebooks
nginx
jupyter
certbot
YOUR_EMAIL
保存文件并使用 + 然后关闭文件编辑器。CTRLXENTER
创建一个名为 的新目录。nginx
# mkdir nginx
创建一个名为 的新文件 。nginx.conf
# nano nginx/nginx.conf
将以下内容添加到文件中。
events {}
http {
server_tokens off;
charset utf-8;
server {
listen 80 default_server;
server_name _;
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
上述配置指示 Nginx 服务器为 Certbot 生成的 ACME 质询提供服务。您必须对 Certbot 容器执行此步骤,以验证域名的所有权并为其颁发 SSL 证书。在后面的步骤中交换此配置以设置反向代理服务器。
保存文件并使用 + 然后关闭文件编辑器。CTRLXENTER
创建一个使用命令命名的新文件。dhparam.pem
openssl
# openssl dhparam -dsaparam -out nginx/dhparam.pem 4096
上面的命令生成一个 DHparam 或 Diffie-Hellman 参数,这是一种密钥交换算法,用于保护双方之间的通信。您可以将其用作另一层安全性,以保护服务器免受恶意个人的黑客攻击或攻击,这些个人可能会尝试拦截或解密服务器和客户端之间的通信。
在启动服务之前,您必须使用记录将您的域名指向服务器的 IP 地址。
A
部署 Docker 撰写服务。
# docker-compose up -d
上述命令以分离模式启动文件中定义的服务。这意味着服务将在后台启动,您可以将终端用于其他命令。docker-compose.yaml
验证 SSL 颁发。
# ls certbot/conf/live/tensorflow.example.com/
上面的命令输出 Certbot 为您的域名创建的目录中的内容列表。输出应包含 和 文件。生成 SSL 证书最多可能需要五分钟。如果此命令花费的时间超过此时间,则可以通过使用命令查看日志进行故障排除。fullchain.pem
privkey.pem
docker-compose logs certbot
停止容器。nginx
# docker-compose stop nginx
上面的命令停止容器,以便您可以在后续步骤中交换 Nginx 配置。nginx
交换 Nginx 配置。
# rm -f nginx/nginx.conf
# nano nginx.conf
将以下内容添加到文件中。
events {}
http {
server_tokens off;
charset utf-8;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name tensorflow.example.com;
ssl_certificate /etc/letsencrypt/live/tensorflow.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tensorflow.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
proxy_pass http://jupyter:8888;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Scheme $scheme;
proxy_buffering off;
}
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
上述配置使用 Certbot 生成的 SSL 证书和其他 SSL 参数来提高工作区的安全性。它配置一个反向代理服务器,将传入流量引导到端口上的容器。它还定义了一个位置块,用于使用 Cron为 SSL 续订提供 ACME 质询文件。jupyter
8888
保存文件并使用 + 然后关闭文件编辑器。CTRLXENTER
启动容器。nginx
# docker-compose start nginx
上述命令启动使用新配置的容器。可以通过在 Web 浏览器中打开来确认工作区的部署。nginx
https://tensorflow.example.com
从 Docker 日志中获取令牌。
# docker-compose logs jupyter
上述命令输出容器生成的日志。它包含访问 Jupyter 笔记本接口的令牌。jupyter
您还可以按照以下步骤设置用于访问 Jupyter 笔记本界面的密码。
- 使用 在 Web 浏览器上打开 Jupyter 笔记本界面。
https://tensorflow.example.com
- 向下滚动到“设置密码”部分。
- 输入从 Docker 撰写日志中提取的令牌。
- 输入要用于保护接口的密码。确保使用强密码来保护您的环境免受暴力攻击。
- 单击“登录并设置新密码”按钮。
将条目追加到 Cron 表。
# crontab -e
上面的命令打开 Cron 表编辑器。 是 Linux 操作系统中的内置作业调度程序,用于在计划的时间运行指定的命令。请参阅如何使用 Cron 任务计划程序以了解更多信息。cron
将以下行添加到表中。
0 5 1 */2 * /usr/local/bin/docker-compose start -f /root/tensorflow-workspace/docker-compose.yml certbot
5 5 1 */2 * /usr/local/bin/docker-compose restart -f /root/tensorflow-workspace/docker-compose.yml nginx
上述语句定义了两个任务,分别启动容器以重新生成 SSL 证书,并重新启动容器以使用最新的 SSL 证书重新加载配置。certbot
nginx
使用 then 和 退出编辑器。ESC!WQENTER
启用防火墙。
# ufw allow 80,443,22 proto tcp
# ufw enable
上述命令启用防火墙,并允许端口上的传入连接用于 HTTP 流量、HTTPS 流量和 SSH 连接。80
443
22
六、结论
本文演示了使用官方 Docker 镜像和 NVIDIA Docker 工具包部署临时或持久 TensorFlow 工作区的步骤。您可以部署临时工作区,以利用 Vultr 提供的高端硬件来执行资源密集型任务,例如训练模型或执行可视化。您还可以为高效的远程开发环境部署持久工作区,因为 Jupyter 笔记本界面允许您与其他人一起处理机器学习项目。