文档
注册

安全说明

漏洞提示

PyTorch 1.11.0存在CVE-2022-45907漏洞,该漏洞因torch.jit.annotations.parse_type_line方法中不安全使用eval方法,存在可以执行任意代码风险。torch_npu已参考LINK进行修复。

安全加固

网络加固

PyTorch分布式训练服务需要在设备间进行通信,通信开启的端口默认为全0侦听,为了避免安全风险,建议用户针对此场景进行安全加固。如使用iptables配置防火墙,在运行分布式训练开始前限制外部对分布式训练使用端口的访问,在运行分布式训练结束后清理防火墙规则。
  • 防火墙规则设定,可参考如下脚本:
    #!/bin/bash
    set -x
    
    # 要限制的端口号
    port={端口号}
    
    # 清除旧规则
    iptables -D INPUT -p tcp -j {规则名}
    iptables -F {规则名}
    iptables -X {规则名}
    
    # 创建新的规则链
    iptables -t filter -N {规则名}
    
    # 在多机场景下设定白名单,允许其他节点访问主节点的侦听端口
    # 在规则链中添加允许特定IP地址范围的规则
    iptables -t filter -A {规则名} -i eno1 -p tcp --dport $port -s {允许外部访问的IP} -j ACCEPT
    
    # 屏蔽外部地址访问分布式训练端口
    # 在PORT-LIMIT-RULE规则链中添加拒绝其他IP地址的规则
    iptables -t filter -A {规则名} -i {要限制的网卡名} -p tcp --dport $port -j DROP
    
    # 将流量传递给规则链
    iptables -I INPUT -p tcp -j {规则名}
  • 防火墙规则移除,可参考如下脚本:
    #!/bin/bash
    set -x
    # 清除规则
    iptables -D INPUT -p tcp -j {规则名}
    iptables -F {规则名}
    iptables -X {规则名}

防火墙规则设定和移除示例:

  1. 针对特定端口设定防火墙,脚本中端口号为要限制的端口,在PyTorch分布式训练中端口号请参考表3 通信矩阵;要限制的网卡名为服务器用于分布式通信使用的网卡,允许的外部访问的IP为分布式训练服务器的IP地址。网卡和服务器IP可以通过ifconfig查看,如下文回显的eth0为网卡名,192.168.1.1为服务器IP地址:
    # ifconfig        
    eth0   
         inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
         inet6 addr: fe80::230:64ee:ef1a:c1a/64 Scope:Link
    
  2. 假定服务器主节点地址192.168.1.1,另一台需要进行分布式训练的服务器为192.168.1.2,训练端口为29510。
    • 规则设定可参考如下脚本:
      #!/bin/bash
      set -x
      
      # 设定侦听的端口
      port=29510
      
      # 清除旧规则
      iptables -D INPUT -p tcp -j PORT-LIMIT-RULE
      iptables -F PORT-LIMIT-RULE
      iptables -X PORT-LIMIT-RULE
      
      # 创建新的PORT-LIMIT-RULE规则链
      iptables -t filter -N PORT-LIMIT-RULE
      
      # 在多机场景下设定白名单,允许192.168.1.2访问主节点
      # 在PORT-LIMIT-RULE规则链中添加允许特定IP地址范围的规则
      iptables -t filter -A PORT-LIMIT-RULE -i eno1 -p tcp --dport $port -s 192.168.1.2 -j ACCEPT
      
      # 屏蔽外部地址访问分布式训练端口
      # 在PORT-LIMIT-RULE规则链中添加拒绝其他IP地址的规则
      iptables -t filter -A PORT-LIMIT-RULE -i eth0 -p tcp --dport $port -j DROP
      
      # 将流量传递给PORT-LIMIT-RULE规则链
      iptables -I INPUT -p tcp -j PORT-LIMIT-RULE
    • 规则移除可参考如下脚本:
      #!/bin/bash
      set -x
      # 清除规则
      iptables -D INPUT -p tcp -j PORT-LIMIT-RULE
      iptables -F PORT-LIMIT-RULE
      iptables -X PORT-LIMIT-RULE

权限控制

  • 建议用户对训练所需文件、训练过程中保存的文件、用户个人的隐私数据、商业资产等敏感文件做好权限控制等安全措施,例如多用户共享数据集场景下的数据集文件写权限控制、profiler等场景产生数据文件权限控制等,设定的权限建议参考表1 文件权限参考进行设置。
  • torch_npu中profiler工具会生成性能记录文件,生成的文件权限为640 ,文件夹权限为750 ,用户可根据需要自行对生成后的相关文件进行权限控制。
  • 用户安装和使用过程需要做好权限控制,建议参考表1 文件权限参考进行设置。如需要保存安装/卸载日志,可在安装/卸载命令后面加上参数--log <FILE>, 注意对<FILE>文件及目录做好权限管控。
  • PyTorch框架运行中所生成的文件权限依赖系统设定,如torch.save接口保存的文件。建议当前执行脚本的用户根据自身需要,对生成文件做好权限控制,设定的权限可参考表1 文件权限参考。可使用umask控制默认权限,避免提权等安全风险,建议用户将主机(包括宿主机)和容器中的umask设置为027及其以上,提高安全性。

文件权限参考

建议用户根据自身需要,参考表1 文件权限参考对各类文件进行加固。

表1 文件权限参考

类型

linux权限参考值

备注

文件夹 / 目录

750 (rwxr-x---)

对于共享目录可为755

数据集文件

640 (rw-r-----)

对于共享数据集文件可为644

checkpoint文件

640 (rw-r-----)

对于checkplint等生成文件可以设置为640

程序文件

440 (r--r-----)

除非开发调试场景,正常运行时程序文件不应再次修改

可执行脚本

750 (rwxr-x---)

针对可执行脚本设置750

网络通信

PyTorch提供分布式训练能力,支持在单机和多机场景下进行训练,需要进行网络通信。其中PyTorch需要使用TCP进行通信,torch_npu使用CANN中HCCL在NPU设备间通信,通信端口见表3。用户需要注意并保障节点间通信网络安全,可以使用iptables等方式消减安全风险,可参考安全加固章节进行网络安全加固。

数据安全

  • PyTorch和torch_npu提供的profiler性能分析工具和torch_npu提供AOE性能调优工具都会在本地生成性能拆解数据。用户需加强对相关数据的保护,需要模型性能调优时使用,调优完成后及时关闭,AOE和Profiler工具具体细节请参考PyTorch 模型迁移和训练指南
  • PyTorch使用过程中需要加载和保存数据,部分接口使用风险模块pickle,可能存在数据风险,如torch.load、torch.distributed.scatter_object_list等接口,可参考torch.loadcollective-functions了解具体风险。
  • AscendPyTorch依赖CANN的基础能力实现AOE性能调优、算子dump、日志记录等功能,用户需要关注上述功能生成文件的权限控制。

编译安全

torch_npu支持源码编译安装,在编译时会下载依赖第三方库并执行构建shell脚本,在编译过程中会产生临时程序文件和编译目录。用户可根据需要自行对源代码目录内的文件进行权限管控避免安全风险。

运行提示

  • 建议根据运行环境资源状况编写训练脚本。若训练脚本与资源状况不匹配,如数据集的size超出内存容量/NPU存储容量等,可能引发错误并导致进程退出。
  • PyTorch和torch_npu在运行异常时会退出进程并打印报错信息,建议根据报错提示定位具体错误原因,包括设定算子同步执行、查看CANN日志、解析生成的Core Dump文件等方式。

公网地址

在torch_npu的配置文件和脚本中存在表2

表2 公网地址

类型

开源代码地址

文件名

公网IP地址/公网URL地址/域名/邮箱地址

用途说明

自研

不涉及

ci\docker\X86\Dockerfile

https://mirrors.huaweicloud.com/repository/pypi/simple

docker配置文件,用于配置pip源

自研

不涉及

ci\docker\X86\Dockerfile

https://download.pytorch.org/whl/cpu

docker配置源,用于配置torch下载连接

自研

不涉及

ci\docker\ARM\Dockerfile

https://mirrors.aliyun.com/pypi/simple

docker配置文件,用于配置pip源

自研

不涉及

setup.cfg

https://gitee.com/ascend/pytorch

用于打包whl的url入参

自研

不涉及

setup.cfg

https://gitee.com/ascend/pytorch/tags

用于打包whl的download_url入参

自研

不涉及

third_party\op-plugin\ci\build.sh

https://gitee.com/ascend/pytorch.git

编译脚本根据torch_npu仓库地址拉取代码进行编译

自研

不涉及

third_party\op-plugin\ci\exec_ut.sh

https://gitee.com/ascend/pytorch.git

UT脚本根据torch_npu仓库地址下拉取代码进行UT测试

开源引入

https://github.com/pytorch/pytorch/blob/main/test/nn/test_convolution.py

https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_mps.py

https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py

test\url.ini

https://download.pytorch.org/test_data/legacy_conv2d.pt

用于test脚本下载相关pt文件

开源引入

https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py

test\url.ini

https://download.pytorch.org/test_data/legacy_serialized.pt

用于test脚本下载相关pt文件

开源引入

https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py

test\url.ini

https://download.pytorch.org/test_data/gpu_tensors.pt

用于test脚本下载相关pt文件

开源引入

https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_nn.py https://github.com/pytorch/pytorch/blob/v2.1.0/test/test_serialization.py

test\url.ini

https://download.pytorch.org/test_data/linear.pt

用于test脚本下载相关pt文件

接口说明

AscendPyTorch是PyTorch适配插件,支持用户使用PyTorch在昇腾设备上进行训练和推理。AscendPyTorch适配后支持用户使用PyTorch原生接口。除了原生PyTorch接口外,AscendPyTorch提供了部分自定义接口,包括自定义算子、亲和库和其他接口,支持PyTorch接口和自定义接口连接,具体可参考PyTorch 模型迁移和训练指南>API列表。

参考PyTorch社区公开接口规范,PyTorchAdapter提供了对外的自定义接口。如果一个函数看起来符合公开接口的标准且在文档中有展示,则该接口是公开接口。否则,使用该功能前可以在社区询问该功能是否确实是公开的或意外暴露的接口,因为这些未暴露接口将来可能会被修改或者删除。

AscendPyTorch使用monkey-patch方式实现PyTorch接口的适配,通过将torch_npu中的部分接口动态替换PyTorch中的接口实现对部分接口的支持。推荐用户使用PyTorch 模型迁移和训练指南>API列表中推荐的调用方式。

AscendPyTorch项目采用C++和Python联合开发,当前除Libtorch场景外正式接口只提供Python接口,在torch_npu的二进制包中动态库不直接提供服务,暴露的接口为内部使用,不建议用户使用。

通信矩阵

通信矩阵具体可参考下表。

表3 通信矩阵

组件

PyTorch

HCCL

源设备

运行torch_npu进程的服务器

运行torch_npu进程的服务器

源IP

设备地址IP

设备地址IP

源端口

操作系统自动分配,分配范围由操作系统的自身配置决定

默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口

目的设备

运行torch_npu进程的服务器

运行torch_npu进程的服务器

目的IP

设备地址IP

设备地址IP

目的端口 (侦听)

默认29500/29400,用户可以设定端口号

默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口

协议

tcp

tcp

端口说明

  1. 在静态分布式场景中(用torchrun/torch.distributed.launch使用的backend为static), 目的端口(默认29500)用于接收和发送数据,源端口用于接收和发送数据
  2. 在动态分布式场景中(用torchrun或者torch.distributed.launch使用的backend为c10d), 目的端口(默认29400)用于接收和发送数据,源端口用于接收和发送数据。可以使用rdzv_endpoint和master_port指定端口号
  3. 在分布式场景中,用torchrun或者torch.distributed.launch不指定任何参数时使用的端口号为29500

默认值为60000,取值范围[0,65520]。用户可以通过HCCL_IF_BASE_PORT环境变量指定Host网卡起始端口号,配置后系统默认占用以该端口起始的16个端口

侦听端口是否可更改

认证方式

无认证方式

无认证方式

加密方式

所属平面

不涉及

不涉及

版本

所有版本

所有版本

特殊场景

备注

该通信过程由开源软件PyTorch控制,配置为PyTorch原生设置,可参考PyTorch文档。源端口由操作系统自动分配,分配范围由操作系统的配置决定,例如ubuntu:采用/proc/sys/net/ipv4/ipv4_local_port_range文件指定,可通过cat /proc/sys/net/ipv4/ipv4_local_port_range或sysctl net.ipv4.ip_local_port_range查看

该通信过程由CANN中HCCL组件控制,torch_npu不进行控制,端口范围可参考环境变量参考“执行相关 > 集合通信与分布式训练 > 集合通信相关配置>HCCL_IF_BASE_PORT”集合通信接口参考

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词