栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

分布式GNN系统环境配置

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分布式GNN系统环境配置

分布式GNN系统环境配置
  • DL环境
    • Anaconda
      • scp命令
      • 安装anaconda
        • conda 虚拟环境命名
      • 创建虚拟环境安装pytorch1.9.
      • 安装DGL库
      • 配置VScode远程调试
        • !!!配置anaconda环境
        • 配置debug的输入参数
  • 分布式环境
    • 数据集处理
      • 下载
      • 图分割
    • 文件共享环境
      • Server端
      • client端
    • SSH免密访问
    • 一些问题
      • 相关包没有安装
      • Failed bind on 192.168.1.7:30050 , error: Address already in use
      • bash conda: command not found
      • /usr/bin/python: No module named torch.distributed
      • /opt/dgl/src/rpc/network/tcp_socket.cc:76: Failed bind on 192.168.1.9:30050 , error: Cannot assign requested address
      • TensorDispatcher: dlopen failed: libtorch_cuda_cpp.so: cannot open shared object file: No such file or directory

DL环境 Anaconda

由于已经有部分机器已经安装了anaconda,同时有安装包,所以直接将其他包传输到所需机器上

scp命令

利用scp文件传输
scp Anaconda3-2021.05-Linux-x86_64.sh name@192.168.1.11:/home/name

使用scp传文件时出现“ECDSA host key for 。。。 has changed and you have requested strict checking.Host key verification fail”
解决方案:应该是远程服务器缓存问题,参考link

安装anaconda

直接按照此链接安装

conda 虚拟环境命名

参考Anaconda——如何“重命名”conda虚拟环境(通过复制和删除操作实现)

创建虚拟环境安装pytorch1.9.

链接

conda install pytorch==1.9.0 torchvision torchaudio cudatoolkit=11.1 -c pytorch -c conda-forge

最好不要规定torchvision跟torchaudio的版本,不然有可能对应不上,从而在验证

torch.cuda.is_available()时出现false

!!!由于中间服务器被其他人使用过,使用conda install时一直出现

CondaHTTPError: HTTP 000 CONNECTION
在网上查找时基本上都是让换源,相关操作有
vim ~/.condarc
conda config --show channels
conda config --add channels
conda config --set show_channel_urls yes
conda config –remove channels
但是基本上都不管用,于是就ping了下百度域名,提示出现bad address,ping百度ip却能ping通,这个时候才知道原来是DNS解析失败
基本的解决方案可以查看linuxUbuntu解决DNS问题,无法解析域名,修改nameserver之后就可以了

!!!conda现在安装的时候可能出现

PackagesNotFoundError: The following packages are not available from current channels

查了一下可能是channel的问题,link1,link2
这个时候需要

conda config --show channels
conda config --add channels conda-forge

另外还遇到了

conda创建环境报错:NotWritableError: The current user does not have write permissions to a required path.

查了一下是权限的问题,按照link即可解决

安装DGL库

关于图网络,最近看到一个特别不错的blog,link
根据link选择合适版本的dgl,我们选用cuda11.1,运行
conda install -c dglteam dgl-cuda11.1

配置VScode远程调试

Vscode配置link

!!!配置anaconda环境

1.打开setting.json,参考link
2.配置setting文件,很早之前配的如下
也可参考link上述配置信息标点及文件位置需要替换

    "python.condaPath":"~/.conda/envs/tf12/bin/conda",
    "python.pythonPath":"~/.conda/envs/tf12/bin/python3.6",
    "python.autoComplete.extraPaths": [
        "~/.conda/envs/tf12/bin/python"
    ],
    "python.autoComplete.addBrackets": true,
    "python.jediEnabled": false,
    "remote.SSH.showLoginTerminal": true,
    "workbench.editorAssociations": {
        "*.ipynb": "jupyter-notebook"
    },
    "python.defaultInterpreterPath": "~/.conda/envs/tf12/bin/python3.6",
    "python.analysis.extraPaths": [
        "~/.conda/envs/tf12/bin/python"
    ],
    "python.analysis.completeFunctionParens": true,
    "notebook.cellToolbarLocation": {
        "default": "right",
        "jupyter-notebook": "left"
    },
    "python.languageServer": "Microsoft",
    "window.zoomLevel": -1,
    "editor.fontSize": 15
配置debug的输入参数

查看vscode 调试python代码时添加参数(args)

分布式环境

根据dgl提供的tutorial进行分布式环境搭建,Distributed Node Classification

数据集处理 下载

数据集下载直接从ogb包下载,

from ogb.nodeproppred import DglNodePropPredDataset
data = DglNodePropPredDataset(name='ogbn-products')
图分割

dgl采用METIS库,具体调用使用

 dgl.distributed.partition_graph(graph, graph_name='ogbn-products', num_parts=2,
                                 out_path='2part_data',
                                 balance_ntypes=graph.ndata['train_mask'],
                                 balance_edges=True)

其中若想自定义切割,官方也提供了方法
主要是要一步步安装GKLib,METIS,ParMETIS库,这些库都是相互依赖的,详细链接为ParMETIS Installation
具体安装步骤大部分都为先

git github_url.git
make config [可加其他参数]
make install

自己的理解:其中make config应该是配置cmake 的编译器,如gcc,mpicc等以及编译环境等等之类的参数,最后使用make install在config中目标目录下生成可执行文件。
没有相关编译器使用

sudo apt-get install xxx

最后将METIS,ParMETIS安装路径添加到环境变量中(export balabala)
按照dgl文档说明的,先要将图的分割方案写成三个.txt文件,分别为xxx_nodes.txt,xxx_edges.txt,xxx_stats.txt,使用命令

mpirun -np 4 pm_dglpart xxx 2

对数据集进行切割,其中的参数可以再dgl文档中查看
最后使用dgl提供的convert.py将ParMETIS切完后的图转换为dgl统一的图结构。

文件共享环境

dgl采用NFS来共享文件

Server端

首先在server上安装

sudo apt-get install nfs-kernel-server

然后将数据集区(切完的图)共享出来
最后配置/etc/exports

内容格式为

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

例如:

/home/ubuntu/workspace  192.168.0.0/16(rw,sync,no_subtree_check)

最后完成配置

sudo systemctl restart nfs-kernel-server
client端

安装

sudo apt-get install nfs-common

然后指定客户端及共享目录

sudo mount -t nfs :/home/ubuntu/workspace /home/ubuntu/workspace

前面是server目录,后面是client端的目录
最后

sudo mount -a

ok,现在就可以在client端访问server共享的文件了。

SSH免密访问

按照文档How to Setup Passwordless SSH Login进行操作即可
查看ssh key pair是否存在

ls -al ~/.ssh/id_*.pub

若不存在,生成SSH key pair并发送至邮箱

ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

查看是否生成成功

ls ~/.ssh/id_*

将密码发送至server端

ssh-copy-id remote_username@server_ip_address

如果ssh-copy-id无法使用,试试

cat ~/.ssh/id_rsa.pub | ssh remote_username@server_ip_address "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

此时即可无密码访问server端

一些问题

在运行分布式的命令

python3 ~/workspace/dgl/tools/launch.py   --workspace ~/workspace/   --num_trainers 1   --num_samplers 0   --num_servers 1   --part_config 4part_data/ogbn-products.json   --ip_config ip_config.txt   "python3 train_dist.py"

遇到了各种问题

相关包没有安装
pip install ogb
conda install scikit-learn
Failed bind on 192.168.1.7:30050 , error: Address already in use

这个问题主要是调试的时候30050(dgl默认端口)端口一直在被占用,所以会报错,把相关进程kill掉即可
查看所有端口占用

sudo netstat -nultp

查看特定端口占用

sudo netstat -anp |grep 22
bash conda: command not found

这个问题好像是通过ssh连的时候会连到一个奇怪的位置,这里面的python版本是2.7,应该是系统自带的python环境,通过在launch.py中添加source anaconda位置解决了,但是依然出现一些问题,例如以下这个:

/usr/bin/python: No module named torch.distributed

这个问题给我的感觉是进程运行的环境不对,它直接定位到了系统自带的python环境,而我的python环境均安装在conda环境中了,dgl的launch.py中有一个选项是

    parser.add_argument('--extra_envs', nargs='+', type=str, default=[],
                        help='Extra environment parameters need to be set. For example, 
                        you can set the LD_LIBRARY_PATH and NCCL_DEBUG by adding: 
                        --extra_envs LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH NCCL_DEBUG=INFO ')

其中关于这个nargs的使用可以参考argparse模块用法实例详解,这里面需要把这个参数放在中间位置,因为它会将最后的“python xxx.py”也当成参数的一部分了暂时还不知道怎么让他停止读参只能改变顺序以下个传递参数为终止。
于是我就想通过这个参数将conda的环境变量加进去,

export PATH=$PATH:/home/username/anaconda3/bin

通过这种方法(export不用加因为launch.py会自动加)让它知道conda的路径,但是这样还是会报一样的错。
最后将server对client端的命令抓取出来发现,该命令为

ssh -o StrictHostKeyChecking=no -p 22 192.168.1.7 'cd /home/amax/gnn-tutorial/distributed_node_classification; (export DGL_ROLE=server DGL_NUM_SAMPLER=0 OMP_NUM_THREADS=1 DGL_NUM_CLIENT=2 DGL_CONF_PATH=2part_data/ogbn-products.json DGL_IP_ConFIG=ip_config.txt DGL_NUM_SERVER=1 DGL_GRAPH_FORMAT=csc  DGL_SERVER_ID=0; source activate torch;python main.py

尝试将引号里的内容直接在client端跑,其中只有一台机器出现等待链接,其他机器一直在报如下错

/opt/dgl/src/rpc/network/tcp_socket.cc:76: Failed bind on 192.168.1.9:30050 , error: Cannot assign requested address

这个问题查的时候说是端口占用,但是输入

sudo netstat -anp |grep 30050

时发现端口并没有被占用,而将ipconfig中的端口号更改之后还是会报一样的错误。

TensorDispatcher: dlopen failed: libtorch_cuda_cpp.so: cannot open shared object file: No such file or directory


依然报错,但是可以运行了,改了下ip.txt跟backend

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号