hfai venv | 运行环境的影分身术

High-Flyer    July 29, 2022

最近,幻方 AI 发布了其沉淀多年的深度学习套件 hfai ,吸引了众多同行研究员和开发者们咨询试用。其中,不少用户朋友对 hfai 中一些功能不太熟悉,使用上存在疑惑,或者仅仅使用了其中非常少的一部分功能。

为此,我们专门创建了 “hfai 使用心法”系列专辑,陆续为大家介绍 hfai 一些功能的设计思路和原理,帮助大家更好更快地习得心法,带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战,举重若轻、例不虚发。

上次文章为大家介绍了 hfai workspace,其可以帮助用户快速同步本地工程目录代码到远程萤火超算中。但是在实际的作业中,我们还会碰到另外一个问题——运行环境的同步怎么处理?这跟上一招式讲到的“本地-萤火,数据通路”其实是一套组合拳,那么本次“心法”就为大家介绍 hfai venv,“本地-萤火,环境共享”——快速实现运行环境的集群部署。

使用场景

上一期文章所介绍的,用户将本地的数据、代码传到萤火超算远程集群之后,任务代码还需要依赖一些必要的环境才能实际跑起来。然而,萤火超算为了安全起见,采用的是一个封闭的内网系统。

幻方AI经过多年的积累,内部环境已经可以满足很多深度学习训练的需求。使用方式如下,在运行代码的开头加入:

import hf_env
hf_env.set_env('202111') 

import ...

之后,提交任务到萤火集群上运行即可。

然而就特定场景而言,用户难免会依赖一些特殊的环境。那么,用户如何方便地将自定义的环境从本地(个人电脑,个人集群)推到远程集群中部署呢?

hfai venv 应运而生,您可以以此构建您自己的运行环境。

命令结构

hfai venv create <venv_name> [--py <py>] [--no_extend]

以上就是 hfai venv 命令的格式,其与 conda 创建环境类似, 会生成一个名为 venv_name 的虚拟环境,python 版本号为 <py>(默认为本地电脑里的 python 版本)。

这里要注意的有两点:

  1. --no_extend 表示不扩展本地环境生成新环境,默认是扩展的。如果不指定 --no_extend 那么新创建的环境只可以在本地使用,不能推送到远程。这是因为依赖的基础环境不能被 hfai venv 所捕获。
  2. 在本地使用 hfai init 初始化用户账户信息时,命令里包含了 --venv_path 参数,这个参数在萤火集群中是 /hf_shared/hfai_envs/ 这个路径,在很多用户的本地电脑里基本不会存在。这里如果不指定 --venv_path,可能在venv创建环境时抛出权限问题。这里建议用户在初始化的过程中指定一个存放自己环境的路径,如下所示:
hfai init <token> --venv_path <local_path>

之后,您就可以顺利创建虚拟环境,并通过 hfai venv list 命令来查看您所创建的虚拟环境了。

环境使用

虚拟环境安装好之后,打开您本地电脑的 ternimal,可以通过如下命令进入该虚拟环境:

source hfai_env <venv_name> 

进入该虚拟环境后,您可以用 pip install 或者 conda install 的方式安装您所需要的依赖。 同时,您也可以人工找到 site-package 的目录并手动导入自己想要的包。以上过程和 python 的流行使用方式一致。

当执行代码时,除了在当前激活的环境下运行,您也可以在项目代码中指定这个虚拟环境。使用非常简单,只需要在主函数代码的最开始引入:

import hfai_env
hfai_env.set_env(<venv_name>) 

import ...

后续的依赖都会在您所指定的这个虚拟环境中加载。

环境部署

完成虚拟环境的创建和安装后,您可以把环境推送到远程萤火集群进行部署。命令如下:

hfai venv push <venv_name>

执行该命令时,本地和后台会发生如下交互:

01.png

hfai workspace 类似,本地与萤火服务层通过 VPN 进行控制交互后,本地环境会先打包发送给OSS,再通过专线导入到萤火集群中。在训练时,模型代码会去搜索加载集群中的这个环境,弹性计算于多个节点中。

这里需要注意的是,与 workspace 不同在于,venv 只有 push 动作,没有 pull,环境只能单向上传到集群里。您可以在本地调试好,不断迭代更新远程集群里的环境。


本文作者: High-Flyer


您可以转载、不违背作品原意地摘录及引用本技术博客的内容,但必须遵守以下条款: 署名 — 您应当署名原作者,但不得以任何方式暗示幻方为您背书,亦不会对幻方的权利造成任何负面影响。 非商业性使用 — 您不得将本技术博客内容用于商业目的。 禁止演绎 — 如果基于该内容改编、转换、或者再创作,您不得公开或分发被修改内容,该内容仅可供个人使用。