- 计算机视觉
- 深度学习
【免费下载链接】computervision-recipes
Best Practices, code samples, and documentation for Computer Vision.
本篇文章围绕 computervision-recipes 仓库中contrib/vm_builder目录下的 VM Builder 工具展开,详细介绍如何通过一条命令在 Azure 上自动创建一台预装完整 Computer Vision 代码与运行环境的 Ubuntu 数据科学虚拟机(DSVM),并通过 SSH 隧道在本地浏览器中直接使用仓库内的 Jupyter Notebook。读完本文,你将掌握该工具的完整交互流程、底层 Azure CLI 调用链、输入校验与配额处理机制,以及 VM 的日常维护与成本控制方法。
工具定位:面向 Computer Vision 工作负载的 DSVM 一键部署脚本
contrib/vm_builder是 computervision-recipes 仓库中contrib(贡献)目录下的一个小型工具项目。根据 contrib/README.md 的说明,contrib目录存放的是与仓库目标一致、但不属于主代码库的扩展内容,这些代码不参与仓库的 DevOps 流水线测试,可能未及时维护,使用时需要自行甄别。VM Builder 在contrib的工具列表中定位为:
帮助用户创建一台带有 GPU 的 Ubuntu Data Science Virtual Machine,并预先安装好 computervision-recipes 仓库,开箱即可使用。
该目录只包含两个文件(见 contrib/vm_builder):
README.md:使用说明文档(本文的原始依据);vm_builder.py:全部逻辑所在的单文件 Python 脚本(约 620 行),不依赖任何独立安装包之外的第三方库(仅使用prompt_toolkit做交互提示)。
官方文档明确强调:该工具只在 Linux 或 Mac 上运行,Windows 用户需要借助其他途径(如 Azure 门户或 Azure CLI 手动创建 VM)。
使用前提
在运行脚本之前,需要确认以下前提条件:
- 一个有效的 Azure 订阅——创建 VM 会产生真实费用,脚本源码的欢迎界面中也明确提示需要
azure.microsoft.com上注册的订阅。 - 已安装 Azure CLI(
az命令)——脚本在启动时会通过which("az")检测az是否存在于 PATH 中(对应源码 check_az_cli_installed),若未安装会直接打印提示并退出。 - 网络与账号权限——执行过程中脚本会调用
az login完成身份认证,并代表你在订阅中创建资源组、虚拟机与执行远程脚本,需要相应权限。
快速开始:一行命令启动交互式部署
官方文档给出的启动方式极其简单,在contrib/vm_builder目录下直接运行:
python vm_builder.py脚本随即进入一个交互式会话(interactive session),像问答向导一样逐项收集信息,并在后台依次完成:登录检查 → 列出订阅 → 收集配置 → 创建资源组 → 创建 DSVM → 远程安装仓库 → 输出连接信息。
一次完整交互大致包含以下环节(均对应源码vm_builder()主流程,见 vm_builder.py):
| 步骤 | 对应源码函数 | 作用 |
|---|---|---|
| 打印欢迎信息 | print_intro_dialogue | 说明工具用途、机型规格与注意事项 |
| 检查 az CLI | check_az_cli_installed | 确认az命令存在 |
| 检查登录状态 | check_logged_in/log_in | 未登录则静默执行az login |
| 展示订阅列表 | show_accounts | 列出当前账号下的订阅 |
| 收集订阅 ID | prompt_subscription_id | 校验输入是否在订阅列表中 |
| 收集 VM 名称 | prompt_vm_name | 校验命名规则 |
| 收集区域 | prompt_region | 校验是否为合法 Azure 区域 |
| 选择 GPU/CPU | prompt_use_gpu | 询问是否使用 GPU 机型 |
| 收集用户名/密码 | prompt_username/prompt_password | 校验强度并二次确认 |
| 配额检查 | check_quota | 不足时提示改用 CPU |
| 创建资源组 | create_rg | az group create |
| 创建虚拟机 | create_vm | az vm create |
| 获取公网 IP | get_vm_ip | az vm show -d |
| 远程安装仓库 | install_repo | az vm run-command invoke |
| 输出总结 | print_exit_dialogue | 打印连接与维护命令 |
交互式部署流程详解(源码级)
下面按脚本实际执行顺序,结合 vm_builder.py 源码逐环节展开。
环境检查与 Azure 登录
脚本先输出一段欢迎信息,说明将创建基于Ubuntu DSVM 镜像的虚拟机,并给出两种机型规格(详见下文)。随后调用check_az_cli_installed()校验 Azure CLI;通过后执行check_logged_in(),通过探测az account list的 stderr 是否包含"az login"来判断登录状态。若未登录,则静默执行:
az login --query "[?n]|[0]"若已登录,则打印绿色提示“Looks like you're already logged in.”,跳过登录环节。
订阅 ID 与区域的校验
登录后脚本先执行az account list -o table展示全部订阅,然后要求用户粘贴订阅 ID。校验逻辑(prompt_subscription_id)通过命令:
az account list --query []."id" -o tsv拿到合法 ID 列表,用户输入必须精确命中列表中的一项,否则会反复提示重试。
区域校验(prompt_region)同理,合法区域来自:
az account list-locations --query []."name" -o tsv如果输入非法,脚本会提示可自行运行az account list-locations查看全部区域,例如典型的eastus。
VM 命名规范
VM 名称的校验规则定义在 validate_vm_name,要点如下:
- 长度必须为1~61 个字符(上限 64 减去 3,因为脚本会自动以
{vm_name}-rg生成资源组名,需为-rg后缀预留 3 个字符); - 只能包含字母、数字与连字符,正则表达式为
^[A-Za-z0-9-]*$。
源码注释同时提示了资源组的自动命名约定,这一点对后续维护很重要:VM 与资源组是一一绑定的,删除资源组即可连带清理 VM 及其附属资源。
GPU 与 CPU 机型选择
脚本允许在 GPU 与 CPU 两种规格间选择,两种规格定义在源码顶部的vm_options字典中(vm_builder.py):
| 选项 | VM 大小 | 实例族 | 核心数 | 说明(来自脚本欢迎界面) |
|---|---|---|---|---|
| GPU | Standard_NC6s_v3 | NCSv3 | 6 | 配备 NVIDIA Tesla V100 GPU,成本更高 |
| CPU | Standard_DS3_v2 | DSv2 | 4 | 通用计算型,成本较低 |
欢迎界面会明确提示 GPU 机型“会带来更高的成本”(It will incur a higher cost),并询问Do you want to use a GPU-enabled VM [y/n]。选择 GPU 后若配额不足,脚本会提供“降级到 CPU”的兜底选项(详见下文配额检查)。
用户名与密码强度校验
密码强度由 validate_password 强制校验,规则如下:
- 长度在12~123 个字符之间;
- 必须同时包含大写字母与小写字母;
- 必须包含数字;
- 必须包含特殊字符(通过
[\W_]正则检测)。
输入密码时使用prompt(..., is_password=True)隐藏回显,并要求二次输入确认,两次不一致会提示重试(prompt_password)。用户名仅要求非空(prompt_username)。
配额检查与 CPU 降级兜底
在真正创建 VM 之前,脚本会先做一次配额预检(check_quota),通过命令:
az vm list-usage --location {region} --query "[?contains(localName,'{family}')].{{max:limit,current:currentValue}}"获取所选实例族在当前区域的配额上限与已用量,并计算剩余可用核心数(get_available_quota)。若剩余配额小于所选机型所需核心数,脚本会提示配额不足,并询问是否改用 CPU 机型:
Do you want to switch to using a CPU instead? (This will likely solve your out-of-quota problem) [y/n]
选择“是”则自动切换为 CPU 规格继续部署;选择“否”则直接退出。GPU 配额通常比 CPU 紧张,这个兜底设计可以有效避免“配额报错导致流程中断”。
底层调用链:脚本在云端做了什么
确认完所有输入后,脚本按以下顺序在 Azure 上执行部署,对应的 CLI 命令都定义在源码顶部的命令常量中(vm_builder.py)。
第一步:创建资源组
az group create --name {vm_name}-rg --location {region}资源组名称固定为{vm_name}-rg。创建成功后脚本会打印绿色成功提示(create_rg)。
第二步:创建 Data Science 虚拟机
az vm create --resource-group {vm_name}-rg --name {vm_name} --size {size} \ --image microsoft-dsvm:linux-data-science-vm-ubuntu:linuxdsvmubuntu:latest \ --admin-username {username} --admin-password {password} --authentication-type password关键参数说明:
--image使用Ubuntu Data Science Virtual Machine 官方镜像(URN 为microsoft-dsvm:linux-data-science-vm-ubuntu:linuxdsvmubuntu:latest,见源码常量 UBUNTU_DSVM_IMAGE),该镜像预装 Anaconda、Jupyter 等数据科学组件;--size由上文 GPU/CPU 选择决定(Standard_NC6s_v3或Standard_DS3_v2);- 认证方式为密码认证(
--authentication-type password)。
创建过程耗时数分钟,随后通过az vm show -d查询公网 IP(get_vm_ip)。
第三步:远程执行仓库安装脚本
VM 就绪后,脚本借助az vm run-command invoke在远端执行安装脚本(install_repo),实际发送到 VM 的 Shell 脚本如下:
export PATH=/anaconda/bin:$PATH conda remove -n cv --all cd /home/{username} rm -rf computervision git clone https://www.github.com/microsoft/computervision chmod 777 computervision cd computervision conda env create -f environment.yml source activate cv python -m ipykernel install --user --name cv --display-name "Python (cv)" jupyter notebook --port 8899 --allow-root --NotebookApp.token='' --NotebookApp.password='' &这段脚本完成了四件事:
- 克隆仓库到用户主目录,并放开目录权限;
- 用仓库根目录的 environment.yml 构建名为
cv的 conda 环境。该环境文件固定了一批关键依赖版本,例如 Python 3.7.6、PyTorch 1.2.0、torchvision 0.4.0、fastai 1.0.57、Jupyter、ipykernel,以及azureml-sdk[notebooks,contrib]、decord、einops等训练与数据处理相关包; - 将
cv环境注册为 Jupyter kernel,显示名为Python (cv),这样 Notebook 页面中就能直接选择该环境; - 在 8899 端口后台启动 Jupyter Notebook。
安装完成后脚本打印“Successfully installed the repo on the machine.”。
连接与使用:SSH 隧道访问 Jupyter
官方文档给出的使用方式是通过 SSH 本地端口转发访问 Jupyter。在本地机器(Linux/Mac)上执行:
ssh -L 8899:localhost:8899 <username>@<ip-address>将远端 8899 端口映射到本机 8899 端口,然后在浏览器中打开:
http://localhost:8899即可看到已就绪的 computervision-recipes 仓库与各场景 Notebook(如scenarios/classification、scenarios/detection等),配合前面注册的cvkernel 直接运行。这与 SETUP.md 中描述的本地环境安装步骤(conda env create -f environment.yml+python -m ipykernel install)逻辑一致,只不过全部由脚本在云端自动完成。
VM 生命周期管理与成本控制
部署完成后,脚本会输出一份“建议保存”的 VM 信息摘要(print_exit_dialogue),包括 VM 名称、公网 IP、区域、用户名、资源组({vm_name}-rg)与订阅 ID,并附上四条关键运维命令:
| 操作 | 命令 |
|---|---|
| 停止 VM | az vm stop -g {vm_name}-rg -n {vm_name} |
| 启动 VM | az vm start -g {vm_name}-rg -n {vm_name} |
| SSH 连接(带端口转发) | ssh -L 8899:localhost:8899 {username}@{vm_ip} |
| 删除 VM(不可恢复) | az group delete -n {vm_name}-rg |
脚本的退出提示会特别强调:虚拟机持续产生费用,请记得在闲置时停止它以控制成本。若不再需要整个环境,直接删除{vm_name}-rg资源组即可一次性清理 VM 及其附属网络、磁盘资源。
注意事项与常见问题
结合源码实现,使用过程中有几点值得特别留意:
- 平台限制:脚本仅在 Linux/Mac 上运行,依赖
subprocess调用az与ssh,Windows 下会失败; - 配额不足:GPU 机型配额不足时,脚本会引导降级到 CPU 机型;若仍失败,可联系 Azure 支持提升对应实例族的区域配额;
- 密码规则严格:必须满足 12~123 字符、大小写、数字与特殊字符四类要求,且二次输入需一致;
- 网络安全提醒(由源码推断):从安装脚本可见,Jupyter 以
--allow-root启动且关闭了 token/password 认证(--NotebookApp.token=''),这意味着任何能访问 8899 端口的人都可以直接操作 Notebook。脚本依赖 SSH 隧道将服务仅暴露给本机,请勿在公网直接开放该端口;若需更强的隔离,建议部署后自行补充认证或网络安全组(NSG)配置; - 仓库地址说明:安装脚本克隆的是脚本内硬编码的
microsoft/computervision仓库地址,克隆后的环境与本仓库(computervision-recipes)的 environment.yml 对应一致;如仓库地址变动导致克隆失败,可参考 contrib/README.md 的提示,改用 Azure 门户或 Azure CLI 手工完成同样的步骤。
延伸:与 VMSS Builder 的关系
在contrib目录中,与 VM Builder 定位互补的还有 vmss_builder:它基于 Azure 虚拟机规模集(VMSS)批量创建多台 DSVM,并为每台机器配置多个 JupyterHub 用户,适用于需要临时为多人准备实验环境(如 hands-on / lab 场景)的情况。VM Builder 则聚焦单台DSVM 的快速开通,适合个人开发或小团队先跑通工作流,两者共享“DSVM + conda 环境 + Notebook 开箱即用”的设计思路。
总而言之,VM Builder 把“开通 Azure VM、克隆仓库、构建 conda 环境、注册 kernel、启动 Jupyter”这一连串手工操作压缩成了python vm_builder.py一条命令,配合交互式校验与配额兜底,是快速获得一套可运行 computervision-recipes Notebook 的云端实验环境的低成本方案。
- 计算机视觉
- 深度学习
【免费下载链接】computervision-recipes
Best Practices, code samples, and documentation for Computer Vision.
相关推荐
终极DeepLearningPython部署指南:在Ubuntu 16.04上配置CUDA环境的完整教程
终极DeepLearningPython部署指南:在Ubuntu 16.04上配置CUDA环境的完整教程 DeepLearningPython是一个为Pytho
5分钟快速部署Web版Ubuntu桌面环境:docker-ubuntu-vnc-desktop终极指南
5分钟快速部署Web版Ubuntu桌面环境:docker ubuntu vnc desktop终极指南 docker ubuntu vnc desktop是一个
虚拟化在 Azure 上使用 Packer 与 Terraform 快速搭建 Nomad 集群沙箱环境
在 Azure 上使用 Packer 与 Terraform 快速搭建 Nomad 集群沙箱环境 本文是一份基于 Nomad 官方仓库 terraform/az
任务调度云原生运维后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考