
# 自定义镜像训练作业配置实例间SSH免密互信
在使用自定义镜像进行分布式训练时，如果未配置训练作业实例间的SSH免密互信，将会导致训练任务失败。为确保实例间的通信顺畅，必须预先配置实例间SSH免密互信，确保分布式训练任务顺利进行。
配置实例间SSH免密互信涉及代码适配和训练作业参数配置，本文提供了一个操作示例。
1. 准备一个预装OpenSSH的自定义镜像，使用的训练框架是MPI或Horovod。
2. 准备一个sshd启动脚本文件"start_sshd.sh"。
   ```
   MY_SSHD_PORT=${MY_SSHD_PORT:-"38888"} 
   mkdir -p /home/ma-user/etc
   ssh-keygen -f /home/ma-user/etc/ssh_host_rsa_key0 -N '' -t rsa > /dev/null
   /usr/sbin/sshd -p $MY_SSHD_PORT -h /home/ma-user/etc/ssh_host_rsa_key0
   ```
   
3. 将准备好的sshd启动脚本文件上传至OBS的训练代码目录下。
4. 创建自定义镜像训练作业。
   - "代码目录"选择存有sshd启动脚本文件的OBS地址。
   
   - "启动命令"需要适配sshd启动脚本，如下所示：
     ```
     bash ${MA_JOB_DIR}/demo-code/start_sshd.sh && your custom command
     ```
     命令中的"your custom command"表示训练作业中需要执行的其他自定义命令。
     
   
   - "环境变量"增加"MY_SSHD_PORT = 38888"。
   
   - 开启（或勾选）"生成节点间SSH免密互信文件"，并设置"SSH免密互信文件目录"，一般保持默认值。该配置会在下发训练作业后，自动在训练容器的"/home/ma-user/.ssh"目录下生成SSH密钥文件和配置文件"authorized_keys config id_rsa id_rsa.pub"。
    
5. 提交创建训练作业后，训练过程中，训练作业的实例可通过域名+端口的方式SSH连接到其他实例，示例代码如下所示：
   ```
   ssh modelarts-job-a0978141-1712-4f9b-8a83-000000000000-worker-1 -p $MY_SSHD_PORT
   ```
   
 
