对于许多使用该环境的机器来说,复制用venv创建的文件夹的替代方法



我有大约30台机器,我计划用它们来运行分布式训练python脚本。他们都有相同的用户名,如果这有帮助的话。我在Windows上,需要使用GPU,以防这也有帮助。它们都有相同的python版本和必要的软件安装,但我需要它们安装相同的版本模块(pandas, matplotlib等)。

我的方法:我最初使用一台机器运行python -m venv myenv,然后运行pip install -r requirements.txt。我把文件夹放在网络驱动器中,并让所有的机器将目录更改到该网络驱动器。因为他们都有相同的用户名,我认为这将是好的。它对一些人有效,但不是所有人。另一种解决方案是让所有机器都运行命令python -m venv myenvpip install -r requirements.txt,但这不是很理想吗?如果我必须添加一个模块怎么办?有人有什么建议吗?

编辑:我希望有一个替代方案的Docker。

30台机器对手工管理来说是相当多的机器。假设您可以SSH访问它们,并且正在考虑将应用程序批量部署到所有这些服务器的解决方案。

这听起来像是Ansible的完美用例。如果你不熟悉,我建议你检查一下,看看它在Windows主机上的工作情况(我个人只在Linux机器上使用过它;Windows常见问题解答)。它有一点学习曲线,但是一旦您准备好了将应用程序部署到一台机器上的工作手册,您就可以扩展主机列表并将完全相同的东西部署到所有30台机器上。

基本上,我会创建一个剧本,让每台机器都创建一个具有依赖关系的本地虚拟环境,但我会从单个节点管理它们。

样本剧本:

---
- name: Do stuff
gather_facts: false
hosts: all
vars:
virtual_environment: "/home/pi/test_env"
tasks:
- name: Install low-level dependencies
become: true
apt:
name: libatlas-base-dev
update_cache: yes
- name: Install pip dependencies
pip:
name:
- pandas
- matplotlib
- numpy
virtualenv: "{{ virtual_environment }}"
virtualenv_command: python3 -m venv
- name: Execute some script
command:
cmd: |
{{ virtual_environment }}/bin/python -c '
import pandas as pd
print("Pandas is installed under:", pd.__file__)
'
register: script
- name: Print the output
debug:
msg: "{{ script.stdout }}"

样品库存:

192.168.0.24
输出:

$ ansible-playbook -i inventory playbook.yml
PLAY [Do stuff] **************************************************************************
TASK [Install low-level dependencies] ****************************************************
ok: [192.168.0.24]
TASK [Install pip dependencies] **********************************************************
ok: [192.168.0.24]
TASK [Execute some script] ***************************************************************
changed: [192.168.0.24]
TASK [Print the output] ******************************************************************
ok: [192.168.0.24] => {
"msg": "Pandas is installed under: /home/pi/test_env/lib/python3.7/site-packages/pandas/__init__.py"
}
PLAY RECAP *******************************************************************************
192.168.0.24               : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

请注意,对于大多数任务,此运行结果为"ok";而不是"改变";这是因为我之前已经运行了这个剧本,这次Ansible注意到这些包已经安装了,所以没有必要再做一次。大多数Ansible模块都是以这种方式设置的,这使得它很有效。参考(非常好!)文档,找出每个模块可用的参数(在上面的示例中,模块是:apt,pip,command,debug)。

也许您可以使用conda环境并导出它:

conda-env export -n myenvnaame > myenvfile.yml

,然后在其他机器上导入:

conda-env create -n venv -f=myenvfile.yml

或者你也可以使用docker在所有机器上共享镜像

虽然这有点超出了纯python的范围,但是为执行创建一个docker容器,用构建指令完成一个设置,将允许该venv与周围的机器设置完全隔离。

Docker允许在同一个机器上运行的多个实例共享相同的定义,所以如果你有一个情况,你运行相同的代码的5个副本,它可以重用相同的内存IIRC共享内存内代码运行时。我读过这个,但没有尝试过内存规格。

相关内容

  • 没有找到相关文章

最新更新