带你 SSH 到 Amazon SageMaker 训练实例一探究竟

0
0
{"value":" #### **1.前言**\n\n[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/) 是一项托管的专门针对[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)而构建的端到端[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)开发平台,[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 在运行脚本、训练算法和部署模型时大量使用容器镜像来管理运行环境,常见有2种模式:\n\n- BYOS(Bring Your Own Script)自定义脚本,使用预先构建好的镜像,用户只需传入自己的代码来运行程序,不需要自己调试镜像,适用于较简单情景。\n- BYOC(Bring Your Own Container)自定义容器,用户需要自己创建镜像来运行程序,适用于用户对任务自定义程度较高的情景。\n\n\n相较而言, BYOC模式较BYOS有着一定复杂度。如果用户本地已经是容器化环境,有固定的[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)平台/框架,包含约定俗成的流程、任务提交方式、参数传递方法等,当往SageMaker BYOC 模式适配时,需要花费时间进行调试,例如修改启动脚本等。在实际跟用户交流过程中,有的用户提出了希望能够SSH 到SageMaker training 实例上以加快适配,如:\n\n1. BYOC 快速集成\n2. 直接进入容器排障\n3. 某些分布式训练框架需要借助 SSH调试,例如 DeepSpeed\n4. 快捷查看容器资源信息,例如查看 p4d.24xlarge 实例中本地盘的挂载路径\n5. 训练过程中某些偶发性问题的深度分析\n\n\n本文将演示一种通过BYOC的方式实现 SSH登陆到SageMaker 训练实例的方法。\n\n#### **2.环境准备**\n\n**2.1 网络配置**\n要连通到SageMaker里的训练容器,前提条件是网络可达。我们需要将训练任务设置为VPC模式运行。\n\n由于全球GPU资源紧张,我们尽量把选定区域的所有可用区都利用起来。为方便快速构建符合要求的隔离网络环境,这里提供3个CloudFormation模板:\n\n- [跨3个AZ(大部分区域)](https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-3azs.yaml)\n- [跨4个AZ(俄勒冈,东京,首尔)](https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-4azs.yaml)\n- [跨6个AZ(美东)](https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-6azs.yaml)\n\n\n以美东为例,我们选择6AZ模板。\n\n注意:默认每个区域只有5个弹性IP,可以到 Service Quotas 申请提额 [https://us-east-1.console.aws.amazon.com/servicequotas/home/services/ec2/quotas](https://us-east-1.console.aws.amazon.com/servicequotas/home/services/ec2/quotas)。\n\n找到EC2服务组,输入“IP”进行搜索,定位到 “EC2-VPC Elastic IPs”:\n\n![image.png](https://dev-media.amazoncloud.cn/6c7e9da67c544591b56d977d9c8720b0_image.png)\n\n这里演示我们先提升到10,申请后需要等待一段时间。提额生效后,打开 [Amazon CloudFormation](https://aws.amazon.com/cn/cloudformation/) 控制台创建堆栈页面 [https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/create/template](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/create/template)。\n\n上传模板,美东区域我们选择 sagemaker-vpc-6azs。\n\n![image.png](https://dev-media.amazoncloud.cn/533dc1b2dc2547a4a345c3e709eee177_image.png)\n\n**2.2 安全配置**\n\n打开 IAM 控制台角色页面 [https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles),创建新角色:\n\n![image.png](https://dev-media.amazoncloud.cn/46c59b141d774da8a90dff6a93bfe05c_image.png)\n\n默认会带AmazonSageMakerFullAccess权限:\n\n![image.png](https://dev-media.amazoncloud.cn/b6e73a33c2f54582924f4bf4b64c9c84_image.png)\n\n点击下一步,输入角色名,例如“SageMaker-Studio-Admin”,然后创建。\n\n创建后,添加内联策略,增加[Amazon S3](https://aws.amazon.com/cn/s3/)、[Amazon ECR](https://aws.amazon.com/cn/ecr/)、[Amazon CodeBuild](https://aws.amazon.com/cn/codebuild/)等权限。\n\n![image.png](https://dev-media.amazoncloud.cn/c1d3cd5515324eb2a1bad6bfc40bd085_image.png)\n\n切换到JSON Tab 页:\n\n![image.png](https://dev-media.amazoncloud.cn/2008613e422e4474ae5b30733a1681f8_image.png)\n\n替换为以下JSON定义:\n\n```\\n{\\n \\"Version\\": \\"2012-10-17\\",\\n \\"Statement\\": [\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"codebuild:DeleteProject\\",\\n \\"codebuild:CreateProject\\",\\n \\"codebuild:BatchGetBuilds\\",\\n \\"codebuild:StartBuild\\"\\n ],\\n \\"Resource\\": \\"arn:aws:codebuild:*:*:project/sagemaker-studio*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": \\"logs:CreateLogStream\\",\\n \\"Resource\\": \\"arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"logs:GetLogEvents\\",\\n \\"logs:PutLogEvents\\"\\n ],\\n \\"Resource\\": \\"arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": \\"logs:CreateLogGroup\\",\\n \\"Resource\\": \\"*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"ecr:CreateRepository\\",\\n \\"ecr:BatchGetImage\\",\\n \\"ecr:CompleteLayerUpload\\",\\n \\"ecr:DescribeImages\\",\\n \\"ecr:DescribeRepositories\\",\\n \\"ecr:UploadLayerPart\\",\\n \\"ecr:ListImages\\",\\n \\"ecr:InitiateLayerUpload\\",\\n \\"ecr:BatchCheckLayerAvailability\\",\\n \\"ecr:PutImage\\"\\n ],\\n \\"Resource\\": [\\n \\"arn:aws:ecr:*:*:repository/sagemaker-studio*\\",\\n \\"arn:aws:ecr:*:*:repository/byoc*\\"\\n ]\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": \\"ecr:GetAuthorizationToken\\",\\n \\"Resource\\": \\"*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"s3:GetObject\\",\\n \\"s3:DeleteObject\\",\\n \\"s3:PutObject\\"\\n ],\\n \\"Resource\\": \\"arn:aws:s3:::sagemaker-*/*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"s3:CreateBucket\\"\\n ],\\n \\"Resource\\": \\"arn:aws:s3:::sagemaker*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": [\\n \\"iam:GetRole\\",\\n \\"iam:ListRoles\\"\\n ],\\n \\"Resource\\": \\"*\\"\\n },\\n {\\n \\"Effect\\": \\"Allow\\",\\n \\"Action\\": \\"iam:PassRole\\",\\n \\"Resource\\": \\"arn:aws:iam::*:role/*\\",\\n \\"Condition\\": {\\n \\"StringLikeIfExists\\": {\\n \\"iam:PassedToService\\": \\"codebuild.amazonaws.com\\"\\n }\\n }\\n }\\n ]\\n}\\n```\n\n策略名称保存为:SageMakerCodeBuildPolicy。\n\n后续步骤中,我们将借助 sagemaker-studio-image-build-cli 工具来自动构建 Docker 镜像,参考:[https://github.com/aws-samples/sagemaker-studio-image-build-cli](https://github.com/aws-samples/sagemaker-studio-image-build-cli)。\n\n工具需要用到 Amazon CodeBuild,所以需要修改角色信任关系,添加对 CodeBuild 服务的信任策略。使得 CodeBuild 可以 Assume SageMaker 的执行角色。\n\n![image.png](https://dev-media.amazoncloud.cn/e31271de05b347e783e13c31030ddd17_image.png)\n\n替换为以下内容:\n\n```\\n{\\n \\"Version\\": \\"2012-10-17\\",\\n \\"Statement\\": [\\n {\\n \\"Sid\\": \\"\\",\\n \\"Effect\\": \\"Allow\\",\\n \\"Principal\\": {\\n \\"Service\\": [\\n \\"codebuild.amazonaws.com\\",\\n \\"sagemaker.amazonaws.com\\"\\n ]\\n },\\n \\"Action\\": \\"sts:AssumeRole\\"\\n }\\n ]\\n}\\n```\n\n#### **2.3 准备SageMaker Studio**\n\n为了演示更多的场景,我们设计了松耦合模式,拆开了“提交训练环境”和“远程调试终端”。接下来我们将分别准备:\n\n- SageMaker Studio (打包镜像、运行 Jupyter 笔记本)\n- Cloud9 (SSH 可选终端一)\n- SageMaker Notebook Instance (SSH 可选终端二)\n\n\n您实际使用时完全可以根据自身情况只选择一种:\n\n- 如果您已经在用 Notebook Instance,则可以在同一个控制台页面完成命令行和笔记本操作。\n- 如果您平时采用EC2机器(例如G5),基于 SageMaker Python SDK 直接提交训练任务,可以只参考 Cloud9 的操作流程。\n\n\n打开 SageMaker 控制台 Studio 页面:[https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/studio-landing](https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/studio-landing)。\n\n首先启用配置:\n\n![image.png](https://dev-media.amazoncloud.cn/0f6bd7d0235e4aec9e8a8cf68082abf9_image.png)\n\n设置Profile名称,执行角色选择前面创建的 SageMaker-Studio-Admin:\n\n![image.png](https://dev-media.amazoncloud.cn/e1b0fc6b7d8b4f36a0ce425e6c571e26_image.png)\n\n其他保持默认,提交创建。等待约5分钟左右创建完成(可以先准备 Cloud9 和 SageMaker Notebook 实例)。\n\n#### **2.4 准备Cloud9**\n\n打开 Cloud9 控制台:\n\n[https://us-east-1.console.aws.amazon.com/cloud9/home?region=us-east-1](https://us-east-1.console.aws.amazon.com/cloud9/home?region=us-east-1)。\n\n创建一个Cloud9环境,设置名称例如 “byoc-debug-ide”:\n\n![image.png](https://dev-media.amazoncloud.cn/505a473512144c7798ccbd8459c211db_image.png)\n\n下一步环境配置,注意以下几点:\n\n- 如果只是用来SSH到容器,micro即可。\n- 如果有编译代码等其他需求,建议调整为C系或者M系。\n- 为节约成本,可以设置空闲时间,例如空闲1小时后自动停止。\n- 网络配置,选择任意一个私有子网,例如这里选择“PrivateSubnet01”。\n- 因为是放在私有子网,访问方式需要选择“Systems Manager”。\n\n\n其他保持默认,点击创建。约等待 1~2 分钟即可打开Cloud9控制台。 如果出现确实无法访问的情况(不排除是出口网络问题),可以把刚创建的 Cloud9 删除,重新创建一个。\n\n![image.png](https://dev-media.amazoncloud.cn/b005c8ca41a147d8b2e806972e0c2ef1_image.png)\n\n创建完成后,注意需要绑定安全组,后续才能访问 SageMaker 拉起的容器。\n\n首先跳转到EC2控制台:\n\n![image.png](https://dev-media.amazoncloud.cn/335c8c0d40eb4594880e3427d4024d84_image.png)\n\n然后修改安全组配置:\n\n![image.png](https://dev-media.amazoncloud.cn/678e7862c86b47dbb0c6d80ba77a7845_image.png)\n\n搜索InternalSecurityGroup,附加到实例:\n\n![image.png](https://dev-media.amazoncloud.cn/48b7bdd32b7a4853998ba15203a3101c_image.png)\n\n#### **2.5 准备Notebook**\n\n打开 SageMaker 控制台 Notebook 实例页面 [https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances](https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances)。\n\n创建新Notebook,参数如下:\n\n- 名字:byoc-debug-notebook\n- 平台:notebook-al2-v1\n- 角色:SageMaker-Studio-Admin\n- 网络:可以选择任意一个私有子网,为了与前面的Cloud9区分,这里选择“PrivateSubnet02”\n- 安全组:InternalSecurityGroup\n- 互联网访问:注意一定要选择“Disable”,从而走VPC的网络跟外部通信\n\n![image.png](https://dev-media.amazoncloud.cn/ea2c57149e7248dd8f375c63582cfda5_image.png)\n\n#### **3.集成准备**\n\n我们在官方原版 SageMaker Immersion Day 的基础上,对BYOC场景进行了扩展,添加了SSH支持。\n\n原版地址:[https://github.com/aws-samples/amazon-sagemaker-immersion-day](https://github.com/aws-samples/amazon-sagemaker-immersion-day)。\n\n扩展版地址:[https://github.com/AIMLTOP/amazon-sagemaker-immersion-day](https://github.com/AIMLTOP/amazon-sagemaker-immersion-day)。\n\n##### 3.1 拉取代码\n\n打开 SageMaker Studio\n\n![image.png](https://dev-media.amazoncloud.cn/cffab53f9a3a476fb593959825971974_image.png)\n\n第一次打开需要初始化,等待约2分钟左右。进入后,首先开一个终端。\n\n有2种方式:\n\n1. 通过File菜单\n2. 通过Launcher页面的快捷入口\n\n![image.png](https://dev-media.amazoncloud.cn/9af71a6280c540b69fbc488831cdaea4_image.png)\n\n拉取代码:\n\n```\\ncd ~/\\n\\necho \\"clone code from github\\"\\ngit clone https://github.com/AIMLTOP/amazon-sagemaker-immersion-day byoc-debug\\n\\ncd ~/byoc-debug\\n```\n\n##### 3.2 打开笔记本\n\n从左边文件浏览器窗口,依次进入 byoc-debug/byoc 目录。\n\n双击打开 byoc.ipynb,Kernel 选择 Python 3 (Data Science) :\n\n![image.png](https://dev-media.amazoncloud.cn/c69a8adc8f5e4aa2a86c6c5e793d951e_image.png)\n\n##### 3.3 安装依赖包\n执行 “cell 00”,安装依赖包,特别是 sagemaker-studio-image-build 工具,用于自动构建 Docker 镜像并推送到 ECR 镜像仓库。\n\n![image.png](https://dev-media.amazoncloud.cn/2e99df3ad30249938611f4b9ba1dce74_image.png)\n\n##### 3.4 准备 Dockerfile\n在 scikit_container 目录下,有一个准备好的示例Dockefile:\n\n![image.png](https://dev-media.amazoncloud.cn/e9ea490ac14f4e5cb8605fa9871a6b70_image.png)\n\n注意:\n\n1. SageMaker Immersion Day原版的基础镜像用的是DockerHub的ubuntu:18.04,免费的DockerHub账号,镜像拉取有频率限制。这里替换成了AWS的免费公开镜像仓库。\n2. 在原版Dockerfile的基础上,增加了SSH的配置。\n\nDockerfile 有一行关键配置如下:\n\n```COPY ssh/id_rsa.pub /root/.ssh/authorized_keys```\n\n首先将允许外部访问 SageMaker 训练容器的机器(Cloud9/EC2/SageMaker Notebook 实例等)公钥保存在 ssh目录下的 id_rsa.pub 文件。\n\n接着生成 Docker 镜像时,会复制到容器环境root用户下的.ssh目录。\n\n\n##### 3.5 生成SSH Key\n\n这里我们演示 2 个场景:\n\n1. 从 Cloud9 SSH 到 SageMaker 训练容器\n2. 从 SageMaker Notebook 实例 SSH 到 SageMaker 训练容器\n\n首先进入 Cloud9 命令行界面,生成 SSH Key:\n\n```ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa```\n\n.ssh 目录默认不可见,复制到另一个目录方便下载:\n\n```\\nmkdir -p ~/environment/ssh\\ncp -R ~/.ssh/id_rsa.pub ~/environment/ssh/id_rsa_cloud9.pub\\n```\n\n![image.png](https://dev-media.amazoncloud.cn/ca4425b0cb64438d88248b7a6e72b562_image.png)\n\n下载 id_rsa_cloud9.pub 到本地。\n\n然后进入SageMaker 控制台 Notebook 实例页面 [https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances](https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances)。\n\n\n找到前面准备好的 byoc-debug-notebook 笔记本,点击如下图所示的 “Open JupyterLab”:\n\n![image.png](https://dev-media.amazoncloud.cn/5b9f6d47bba048ecbbe5469f2c2cc1c4_image.png)\n\n打开后,默认里面是空的,可以通过单击如下图所示的 Terminal 打开终端 shell 环境:\n\n![image.png](https://dev-media.amazoncloud.cn/b376f9adc5ff4702a39e33a284f9c241_image.png)\n\n生成 SSH Key:\n\n```ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa```\n\n.ssh 目录默认不可见,复制到 SageMaker 文件浏览器根目录的下级目录方便下载:\n\n```\\nmkdir -p ~/SageMaker/ssh\\ncp -R ~/.ssh/id_rsa.pub ~/SageMaker/ssh/id_rsa_notebook.pub\\n```\n\n![image.png](https://dev-media.amazoncloud.cn/fe5afcc060cf4cc99896c772f8df7483_image.png)\n\n下载 id_rsa_notebook.pub 到本地。\n\n在本地将 id_rsa_cloud9.pub 和 id_rsa_notebook.pub合并成一个文件 id_rsa.pub,类似如下:\n\n![image.png](https://dev-media.amazoncloud.cn/a1cd448ebaa444618ceb195c5fd38ad6_image.png)\n\n如果有更多机器需要 SSH 到训练容器,例如 EC2 机器,流程是一样的:\n\n- 登录到调试机器生成 SSH Key\n- 将公钥加到pub\n- 重新打包镜像\n\n#### **4.模型训练**\n\n##### 4.1 生成镜像\n\n回到 SageMaker Studio 控制台打开的 Jupyter 笔记本页面。\n\n将前面准备好的 id_rsa.pub 上传到 /byoc-debug/byoc/scikit_container/ssh/ 目录,然后执行 “cell 01”\n\n![image.png](https://dev-media.amazoncloud.cn/f6f3308d6aa544b481b0d21eca6efa42_image.png)\n\n这里注意,如果您修改了仓库名称,不是 byoc 或者 sagemaker-studio 的前缀,您需要在前面的步骤中添加权限。\n\n执行成功,最后输出类似如下:\n\n![image.png](https://dev-media.amazoncloud.cn/77ae545540f34e308e595cecb96fc1dc_image.png)\n\n##### 4.2 准备测试数据\n依次执行 “cell 02”,“cell 03” 和 “cell 04”\n\n![image.png](https://dev-media.amazoncloud.cn/4f904535e3524a7d9723b9a766b0a5ee_image.png)\n\n##### 4.3 准备启动脚本\n打开 byoc/scikit_container/decision_trees 目录下的 train 脚本:\n\n![image.png](https://dev-media.amazoncloud.cn/a75f535b7582457b838929a08aa8c4bc_image.png)\n\n需要在启动脚本里:\n\n1. 启动SSH后台服务\n2. 打印容器IP地址\n3. 设置睡眠等待时间,例如这里的5分钟(因为数据集很小,训练任务很快完成,只有容器还在运行状态才能SSH)\n\n##### 4.4 配置训练容器网络\n\nSSH 的前提是网络可达,提交任务时需要指定在 VPC 中运行。需要配置:\n\n1. 指定子网信息,这里替换成6个私有子网的ID。\n2. 指定安全组信息,这里替换成 InternalSecurityGroup 安全组的ID。\n\n![image.png](https://dev-media.amazoncloud.cn/ea3dbe6dcf9e47d3a06ae79b61a09470_image.png)\n\n配置完成后,执行“cell 05”\n\n##### 4.5 启动训练\n\n执行“cell 06”,注意这里的配置,增加了 subnets 和 security_group_ids 参数。\n\n![image.png](https://dev-media.amazoncloud.cn/faff015314ac41efb403259e884a4a01_image.png)\n\n#### **5.开发调试**\n\n前面睡眠时间是5分钟,SSH动作要快一些(必须赶在训练任务结束,容器关闭之前,否则不能建连)。\n\n如果前期调试的时候,觉得5分钟太短,可以酌情调整。\n\n##### 5.1 获取容器IP\n\n从日志中获取打印出来的容器IP地址,例如 10.0.159.150:\n\n![image.png](https://dev-media.amazoncloud.cn/9629b9d426154979b8b237d8e8ad8339_image.png)\n\n##### 5.2 Cloud9 SSH\n\n打开 Cloud9 控制台命令行界面,通过 ssh root@container_ip 进行登录,注意替换容器IP,例如:\n\n```ssh root@10.0.159.150```\n\n![image.png](https://dev-media.amazoncloud.cn/f0b2e40bf3ef4a6487c159e20e4cc32c_image.png)\n\n##### 5.3 Notebook SSH\n\n打开 SageMaker Notebook 实例命令行界面,通过 ssh root@container_ip 进行登录,注意替换容器IP,例如:\n\n```ssh root@10.0.159.150```\n\n![image.png](https://dev-media.amazoncloud.cn/1ae39acdb4c54a9fa80b865f1726650f_image.png)\n\n#### **总结**\n\n通过前面的演示,您可以选择任意一种方式使用Notebook或者EC2实例SSH到[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 训练容器里进行探索。除了从外部环境 SSH 到训练容器,您还可以进一步修改镜像配置,允许容器之间可以互相访问,例如 DeepSpeed 多机之间需要通过SSH免密互相登录。\n\n#### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/3b86c6aec10a4ddfbd4139ddd22c2f69_image.png)\n\n**龙斌**\n亚马逊云科技解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于容器和[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)相关领域的研究。\n\n![image.png](https://dev-media.amazoncloud.cn/b77444a856a84842a14436675ce3d9dd_image.png)\n\n**王世帅**\n亚马逊云科技[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)产品技术专家,负责基于亚马逊云科技的[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)方案的咨询与设计,专注于[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)的推广与应用,对于云端深度学习模型分布式训练,NLP等领域有丰富经验,多次面向开发者进行云端[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)产品的介绍与最佳实践经验分享。","render":"<h4><a id=\\"1_0\\"></a><strong>1.前言</strong></h4>\\n<p><a href=\\"https://aws.amazon.com/cn/sagemaker/\\" target=\\"_blank\\">Amazon SageMaker</a> 是一项托管的专门针对[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)而构建的端到端[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)开发平台,[Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 在运行脚本、训练算法和部署模型时大量使用容器镜像来管理运行环境,常见有2种模式:</p>\\n<ul>\\n<li>BYOS(Bring Your Own Script)自定义脚本,使用预先构建好的镜像,用户只需传入自己的代码来运行程序,不需要自己调试镜像,适用于较简单情景。</li>\n<li>BYOC(Bring Your Own Container)自定义容器,用户需要自己创建镜像来运行程序,适用于用户对任务自定义程度较高的情景。</li>\n</ul>\\n<p>相较而言, BYOC模式较BYOS有着一定复杂度。如果用户本地已经是容器化环境,有固定的机器学习平台/框架,包含约定俗成的流程、任务提交方式、参数传递方法等,当往SageMaker BYOC 模式适配时,需要花费时间进行调试,例如修改启动脚本等。在实际跟用户交流过程中,有的用户提出了希望能够SSH 到SageMaker training 实例上以加快适配,如:</p>\n<ol>\\n<li>BYOC 快速集成</li>\n<li>直接进入容器排障</li>\n<li>某些分布式训练框架需要借助 SSH调试,例如 DeepSpeed</li>\n<li>快捷查看容器资源信息,例如查看 p4d.24xlarge 实例中本地盘的挂载路径</li>\n<li>训练过程中某些偶发性问题的深度分析</li>\n</ol>\\n<p>本文将演示一种通过BYOC的方式实现 SSH登陆到SageMaker 训练实例的方法。</p>\n<h4><a id=\\"2_19\\"></a><strong>2.环境准备</strong></h4>\\n<p><strong>2.1 网络配置</strong><br />\\n要连通到SageMaker里的训练容器,前提条件是网络可达。我们需要将训练任务设置为VPC模式运行。</p>\n<p>由于全球GPU资源紧张,我们尽量把选定区域的所有可用区都利用起来。为方便快速构建符合要求的隔离网络环境,这里提供3个CloudFormation模板:</p>\n<ul>\\n<li><a href=\\"https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-3azs.yaml\\" target=\\"_blank\\">跨3个AZ(大部分区域)</a></li>\\n<li><a href=\\"https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-4azs.yaml\\" target=\\"_blank\\">跨4个AZ(俄勒冈,东京,首尔)</a></li>\\n<li><a href=\\"https://github.com/AIMLTOP/amazon-sagemaker-immersion-day/blob/master/byoc/infra/sagemaker-vpc-6azs.yaml\\" target=\\"_blank\\">跨6个AZ(美东)</a></li>\\n</ul>\n<p>以美东为例,我们选择6AZ模板。</p>\n<p>注意:默认每个区域只有5个弹性IP,可以到 Service Quotas 申请提额 <a href=\\"https://us-east-1.console.aws.amazon.com/servicequotas/home/services/ec2/quotas\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/servicequotas/home/services/ec2/quotas</a>。</p>\\n<p>找到EC2服务组,输入“IP”进行搜索,定位到 “EC2-VPC Elastic IPs”:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/6c7e9da67c544591b56d977d9c8720b0_image.png\\" alt=\\"image.png\\" /></p>\n<p>这里演示我们先提升到10,申请后需要等待一段时间。提额生效后,打开 <a href=\\"https://aws.amazon.com/cn/cloudformation/\\" target=\\"_blank\\">Amazon CloudFormation</a> 控制台创建堆栈页面 <a href=\\"https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/create/template\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/create/template</a>。</p>\\n<p>上传模板,美东区域我们选择 sagemaker-vpc-6azs。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/533dc1b2dc2547a4a345c3e709eee177_image.png\\" alt=\\"image.png\\" /></p>\n<p><strong>2.2 安全配置</strong></p>\\n<p>打开 IAM 控制台角色页面 <a href=\\"https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles</a>,创建新角色:</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/46c59b141d774da8a90dff6a93bfe05c_image.png\\" alt=\\"image.png\\" /></p>\n<p>默认会带AmazonSageMakerFullAccess权限:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b6e73a33c2f54582924f4bf4b64c9c84_image.png\\" alt=\\"image.png\\" /></p>\n<p>点击下一步,输入角色名,例如“SageMaker-Studio-Admin”,然后创建。</p>\n<p>创建后,添加内联策略,增加<a href=\\"https://aws.amazon.com/cn/s3/\\" target=\\"_blank\\">Amazon S3</a>、<a href=\\"https://aws.amazon.com/cn/ecr/\\" target=\\"_blank\\">Amazon ECR</a>、<a href=\\"https://aws.amazon.com/cn/codebuild/\\" target=\\"_blank\\">Amazon CodeBuild</a>等权限。</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/c1d3cd5515324eb2a1bad6bfc40bd085_image.png\\" alt=\\"image.png\\" /></p>\n<p>切换到JSON Tab 页:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/2008613e422e4474ae5b30733a1681f8_image.png\\" alt=\\"image.png\\" /></p>\n<p>替换为以下JSON定义:</p>\n<pre><code class=\\"lang-\\">{\\n &quot;Version&quot;: &quot;2012-10-17&quot;,\\n &quot;Statement&quot;: [\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;codebuild:DeleteProject&quot;,\\n &quot;codebuild:CreateProject&quot;,\\n &quot;codebuild:BatchGetBuilds&quot;,\\n &quot;codebuild:StartBuild&quot;\\n ],\\n &quot;Resource&quot;: &quot;arn:aws:codebuild:*:*:project/sagemaker-studio*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: &quot;logs:CreateLogStream&quot;,\\n &quot;Resource&quot;: &quot;arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;logs:GetLogEvents&quot;,\\n &quot;logs:PutLogEvents&quot;\\n ],\\n &quot;Resource&quot;: &quot;arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: &quot;logs:CreateLogGroup&quot;,\\n &quot;Resource&quot;: &quot;*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;ecr:CreateRepository&quot;,\\n &quot;ecr:BatchGetImage&quot;,\\n &quot;ecr:CompleteLayerUpload&quot;,\\n &quot;ecr:DescribeImages&quot;,\\n &quot;ecr:DescribeRepositories&quot;,\\n &quot;ecr:UploadLayerPart&quot;,\\n &quot;ecr:ListImages&quot;,\\n &quot;ecr:InitiateLayerUpload&quot;,\\n &quot;ecr:BatchCheckLayerAvailability&quot;,\\n &quot;ecr:PutImage&quot;\\n ],\\n &quot;Resource&quot;: [\\n &quot;arn:aws:ecr:*:*:repository/sagemaker-studio*&quot;,\\n &quot;arn:aws:ecr:*:*:repository/byoc*&quot;\\n ]\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: &quot;ecr:GetAuthorizationToken&quot;,\\n &quot;Resource&quot;: &quot;*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;s3:GetObject&quot;,\\n &quot;s3:DeleteObject&quot;,\\n &quot;s3:PutObject&quot;\\n ],\\n &quot;Resource&quot;: &quot;arn:aws:s3:::sagemaker-*/*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;s3:CreateBucket&quot;\\n ],\\n &quot;Resource&quot;: &quot;arn:aws:s3:::sagemaker*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: [\\n &quot;iam:GetRole&quot;,\\n &quot;iam:ListRoles&quot;\\n ],\\n &quot;Resource&quot;: &quot;*&quot;\\n },\\n {\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Action&quot;: &quot;iam:PassRole&quot;,\\n &quot;Resource&quot;: &quot;arn:aws:iam::*:role/*&quot;,\\n &quot;Condition&quot;: {\\n &quot;StringLikeIfExists&quot;: {\\n &quot;iam:PassedToService&quot;: &quot;codebuild.amazonaws.com&quot;\\n }\\n }\\n }\\n ]\\n}\\n</code></pre>\\n<p>策略名称保存为:SageMakerCodeBuildPolicy。</p>\n<p>后续步骤中,我们将借助 sagemaker-studio-image-build-cli 工具来自动构建 Docker 镜像,参考:<a href=\\"https://github.com/aws-samples/sagemaker-studio-image-build-cli\\" target=\\"_blank\\">https://github.com/aws-samples/sagemaker-studio-image-build-cli</a>。</p>\\n<p>工具需要用到 Amazon CodeBuild,所以需要修改角色信任关系,添加对 CodeBuild 服务的信任策略。使得 CodeBuild 可以 Assume SageMaker 的执行角色。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/e31271de05b347e783e13c31030ddd17_image.png\\" alt=\\"image.png\\" /></p>\n<p>替换为以下内容:</p>\n<pre><code class=\\"lang-\\">{\\n &quot;Version&quot;: &quot;2012-10-17&quot;,\\n &quot;Statement&quot;: [\\n {\\n &quot;Sid&quot;: &quot;&quot;,\\n &quot;Effect&quot;: &quot;Allow&quot;,\\n &quot;Principal&quot;: {\\n &quot;Service&quot;: [\\n &quot;codebuild.amazonaws.com&quot;,\\n &quot;sagemaker.amazonaws.com&quot;\\n ]\\n },\\n &quot;Action&quot;: &quot;sts:AssumeRole&quot;\\n }\\n ]\\n}\\n</code></pre>\\n<h4><a id=\\"23_SageMaker_Studio_190\\"></a><strong>2.3 准备SageMaker Studio</strong></h4>\\n<p>为了演示更多的场景,我们设计了松耦合模式,拆开了“提交训练环境”和“远程调试终端”。接下来我们将分别准备:</p>\n<ul>\\n<li>SageMaker Studio (打包镜像、运行 Jupyter 笔记本)</li>\n<li>Cloud9 (SSH 可选终端一)</li>\n<li>SageMaker Notebook Instance (SSH 可选终端二)</li>\n</ul>\\n<p>您实际使用时完全可以根据自身情况只选择一种:</p>\n<ul>\\n<li>如果您已经在用 Notebook Instance,则可以在同一个控制台页面完成命令行和笔记本操作。</li>\n<li>如果您平时采用EC2机器(例如G5),基于 SageMaker Python SDK 直接提交训练任务,可以只参考 Cloud9 的操作流程。</li>\n</ul>\\n<p>打开 SageMaker 控制台 Studio 页面:<a href=\\"https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/studio-landing\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/studio-landing</a>。</p>\\n<p>首先启用配置:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/0f6bd7d0235e4aec9e8a8cf68082abf9_image.png\\" alt=\\"image.png\\" /></p>\n<p>设置Profile名称,执行角色选择前面创建的 SageMaker-Studio-Admin:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/e1b0fc6b7d8b4f36a0ce425e6c571e26_image.png\\" alt=\\"image.png\\" /></p>\n<p>其他保持默认,提交创建。等待约5分钟左右创建完成(可以先准备 Cloud9 和 SageMaker Notebook 实例)。</p>\n<h4><a id=\\"24_Cloud9_217\\"></a><strong>2.4 准备Cloud9</strong></h4>\\n<p>打开 Cloud9 控制台:</p>\n<p><a href=\\"https://us-east-1.console.aws.amazon.com/cloud9/home?region=us-east-1\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/cloud9/home?region=us-east-1</a>。</p>\\n<p>创建一个Cloud9环境,设置名称例如 “byoc-debug-ide”:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/505a473512144c7798ccbd8459c211db_image.png\\" alt=\\"image.png\\" /></p>\n<p>下一步环境配置,注意以下几点:</p>\n<ul>\\n<li>如果只是用来SSH到容器,micro即可。</li>\n<li>如果有编译代码等其他需求,建议调整为C系或者M系。</li>\n<li>为节约成本,可以设置空闲时间,例如空闲1小时后自动停止。</li>\n<li>网络配置,选择任意一个私有子网,例如这里选择“PrivateSubnet01”。</li>\n<li>因为是放在私有子网,访问方式需要选择“Systems Manager”。</li>\n</ul>\\n<p>其他保持默认,点击创建。约等待 1~2 分钟即可打开Cloud9控制台。 如果出现确实无法访问的情况(不排除是出口网络问题),可以把刚创建的 Cloud9 删除,重新创建一个。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b005c8ca41a147d8b2e806972e0c2ef1_image.png\\" alt=\\"image.png\\" /></p>\n<p>创建完成后,注意需要绑定安全组,后续才能访问 SageMaker 拉起的容器。</p>\n<p>首先跳转到EC2控制台:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/335c8c0d40eb4594880e3427d4024d84_image.png\\" alt=\\"image.png\\" /></p>\n<p>然后修改安全组配置:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/678e7862c86b47dbb0c6d80ba77a7845_image.png\\" alt=\\"image.png\\" /></p>\n<p>搜索InternalSecurityGroup,附加到实例:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/48b7bdd32b7a4853998ba15203a3101c_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"25_Notebook_254\\"></a><strong>2.5 准备Notebook</strong></h4>\\n<p>打开 SageMaker 控制台 Notebook 实例页面 <a href=\\"https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances</a>。</p>\\n<p>创建新Notebook,参数如下:</p>\n<ul>\\n<li>名字:byoc-debug-notebook</li>\n<li>平台:notebook-al2-v1</li>\n<li>角色:SageMaker-Studio-Admin</li>\n<li>网络:可以选择任意一个私有子网,为了与前面的Cloud9区分,这里选择“PrivateSubnet02”</li>\n<li>安全组:InternalSecurityGroup</li>\n<li>互联网访问:注意一定要选择“Disable”,从而走VPC的网络跟外部通信</li>\n</ul>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/ea2c57149e7248dd8f375c63582cfda5_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"3_269\\"></a><strong>3.集成准备</strong></h4>\\n<p>我们在官方原版 SageMaker Immersion Day 的基础上,对BYOC场景进行了扩展,添加了SSH支持。</p>\n<p>原版地址:<a href=\\"https://github.com/aws-samples/amazon-sagemaker-immersion-day\\" target=\\"_blank\\">https://github.com/aws-samples/amazon-sagemaker-immersion-day</a>。</p>\\n<p>扩展版地址:<a href=\\"https://github.com/AIMLTOP/amazon-sagemaker-immersion-day\\" target=\\"_blank\\">https://github.com/AIMLTOP/amazon-sagemaker-immersion-day</a>。</p>\\n<h5><a id=\\"31__277\\"></a>3.1 拉取代码</h5>\\n<p>打开 SageMaker Studio</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/cffab53f9a3a476fb593959825971974_image.png\\" alt=\\"image.png\\" /></p>\n<p>第一次打开需要初始化,等待约2分钟左右。进入后,首先开一个终端。</p>\n<p>有2种方式:</p>\n<ol>\\n<li>通过File菜单</li>\n<li>通过Launcher页面的快捷入口</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/9af71a6280c540b69fbc488831cdaea4_image.png\\" alt=\\"image.png\\" /></p>\n<p>拉取代码:</p>\n<pre><code class=\\"lang-\\">cd ~/\\n\\necho &quot;clone code from github&quot;\\ngit clone https://github.com/AIMLTOP/amazon-sagemaker-immersion-day byoc-debug\\n\\ncd ~/byoc-debug\\n</code></pre>\\n<h5><a id=\\"32__303\\"></a>3.2 打开笔记本</h5>\\n<p>从左边文件浏览器窗口,依次进入 byoc-debug/byoc 目录。</p>\n<p>双击打开 byoc.ipynb,Kernel 选择 Python 3 (Data Science) :</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/c69a8adc8f5e4aa2a86c6c5e793d951e_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"33__311\\"></a>3.3 安装依赖包</h5>\\n<p>执行 “cell 00”,安装依赖包,特别是 sagemaker-studio-image-build 工具,用于自动构建 Docker 镜像并推送到 ECR 镜像仓库。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/2e99df3ad30249938611f4b9ba1dce74_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"34__Dockerfile_316\\"></a>3.4 准备 Dockerfile</h5>\\n<p>在 scikit_container 目录下,有一个准备好的示例Dockefile:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/e9ea490ac14f4e5cb8605fa9871a6b70_image.png\\" alt=\\"image.png\\" /></p>\n<p>注意:</p>\n<ol>\\n<li>SageMaker Immersion Day原版的基础镜像用的是DockerHub的ubuntu:18.04,免费的DockerHub账号,镜像拉取有频率限制。这里替换成了AWS的免费公开镜像仓库。</li>\n<li>在原版Dockerfile的基础上,增加了SSH的配置。</li>\n</ol>\\n<p>Dockerfile 有一行关键配置如下:</p>\n<p><code>COPY ssh/id_rsa.pub /root/.ssh/authorized_keys</code></p>\\n<p>首先将允许外部访问 SageMaker 训练容器的机器(Cloud9/EC2/SageMaker Notebook 实例等)公钥保存在 ssh目录下的 id_rsa.pub 文件。</p>\n<p>接着生成 Docker 镜像时,会复制到容器环境root用户下的.ssh目录。</p>\n<h5><a id=\\"35_SSH_Key_335\\"></a>3.5 生成SSH Key</h5>\\n<p>这里我们演示 2 个场景:</p>\n<ol>\\n<li>从 Cloud9 SSH 到 SageMaker 训练容器</li>\n<li>从 SageMaker Notebook 实例 SSH 到 SageMaker 训练容器</li>\n</ol>\\n<p>首先进入 Cloud9 命令行界面,生成 SSH Key:</p>\n<p><code>ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa</code></p>\\n<p>.ssh 目录默认不可见,复制到另一个目录方便下载:</p>\n<pre><code class=\\"lang-\\">mkdir -p ~/environment/ssh\\ncp -R ~/.ssh/id_rsa.pub ~/environment/ssh/id_rsa_cloud9.pub\\n</code></pre>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/ca4425b0cb64438d88248b7a6e72b562_image.png\\" alt=\\"image.png\\" /></p>\n<p>下载 id_rsa_cloud9.pub 到本地。</p>\n<p>然后进入SageMaker 控制台 Notebook 实例页面 <a href=\\"https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances\\" target=\\"_blank\\">https://us-east-1.console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances</a>。</p>\\n<p>找到前面准备好的 byoc-debug-notebook 笔记本,点击如下图所示的 “Open JupyterLab”:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/5b9f6d47bba048ecbbe5469f2c2cc1c4_image.png\\" alt=\\"image.png\\" /></p>\n<p>打开后,默认里面是空的,可以通过单击如下图所示的 Terminal 打开终端 shell 环境:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b376f9adc5ff4702a39e33a284f9c241_image.png\\" alt=\\"image.png\\" /></p>\n<p>生成 SSH Key:</p>\n<p><code>ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa</code></p>\\n<p>.ssh 目录默认不可见,复制到 SageMaker 文件浏览器根目录的下级目录方便下载:</p>\n<pre><code class=\\"lang-\\">mkdir -p ~/SageMaker/ssh\\ncp -R ~/.ssh/id_rsa.pub ~/SageMaker/ssh/id_rsa_notebook.pub\\n</code></pre>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/fe5afcc060cf4cc99896c772f8df7483_image.png\\" alt=\\"image.png\\" /></p>\n<p>下载 id_rsa_notebook.pub 到本地。</p>\n<p>在本地将 id_rsa_cloud9.pub 和 id_rsa_notebook.pub合并成一个文件 id_rsa.pub,类似如下:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/a1cd448ebaa444618ceb195c5fd38ad6_image.png\\" alt=\\"image.png\\" /></p>\n<p>如果有更多机器需要 SSH 到训练容器,例如 EC2 机器,流程是一样的:</p>\n<ul>\\n<li>登录到调试机器生成 SSH Key</li>\n<li>将公钥加到pub</li>\n<li>重新打包镜像</li>\n</ul>\\n<h4><a id=\\"4_393\\"></a><strong>4.模型训练</strong></h4>\\n<h5><a id=\\"41__395\\"></a>4.1 生成镜像</h5>\\n<p>回到 SageMaker Studio 控制台打开的 Jupyter 笔记本页面。</p>\n<p>将前面准备好的 id_rsa.pub 上传到 /byoc-debug/byoc/scikit_container/ssh/ 目录,然后执行 “cell 01”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/f6f3308d6aa544b481b0d21eca6efa42_image.png\\" alt=\\"image.png\\" /></p>\n<p>这里注意,如果您修改了仓库名称,不是 byoc 或者 sagemaker-studio 的前缀,您需要在前面的步骤中添加权限。</p>\n<p>执行成功,最后输出类似如下:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/77ae545540f34e308e595cecb96fc1dc_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"42__409\\"></a>4.2 准备测试数据</h5>\\n<p>依次执行 “cell 02”,“cell 03” 和 “cell 04”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/4f904535e3524a7d9723b9a766b0a5ee_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"43__414\\"></a>4.3 准备启动脚本</h5>\\n<p>打开 byoc/scikit_container/decision_trees 目录下的 train 脚本:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/a75f535b7582457b838929a08aa8c4bc_image.png\\" alt=\\"image.png\\" /></p>\n<p>需要在启动脚本里:</p>\n<ol>\\n<li>启动SSH后台服务</li>\n<li>打印容器IP地址</li>\n<li>设置睡眠等待时间,例如这里的5分钟(因为数据集很小,训练任务很快完成,只有容器还在运行状态才能SSH)</li>\n</ol>\\n<h5><a id=\\"44__425\\"></a>4.4 配置训练容器网络</h5>\\n<p>SSH 的前提是网络可达,提交任务时需要指定在 VPC 中运行。需要配置:</p>\n<ol>\\n<li>指定子网信息,这里替换成6个私有子网的ID。</li>\n<li>指定安全组信息,这里替换成 InternalSecurityGroup 安全组的ID。</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/ea3dbe6dcf9e47d3a06ae79b61a09470_image.png\\" alt=\\"image.png\\" /></p>\n<p>配置完成后,执行“cell 05”</p>\n<h5><a id=\\"45__436\\"></a>4.5 启动训练</h5>\\n<p>执行“cell 06”,注意这里的配置,增加了 subnets 和 security_group_ids 参数。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/faff015314ac41efb403259e884a4a01_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"5_442\\"></a><strong>5.开发调试</strong></h4>\\n<p>前面睡眠时间是5分钟,SSH动作要快一些(必须赶在训练任务结束,容器关闭之前,否则不能建连)。</p>\n<p>如果前期调试的时候,觉得5分钟太短,可以酌情调整。</p>\n<h5><a id=\\"51_IP_448\\"></a>5.1 获取容器IP</h5>\\n<p>从日志中获取打印出来的容器IP地址,例如 10.0.159.150:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/9629b9d426154979b8b237d8e8ad8339_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"52_Cloud9_SSH_454\\"></a>5.2 Cloud9 SSH</h5>\\n<p>打开 Cloud9 控制台命令行界面,通过 ssh root@container_ip 进行登录,注意替换容器IP,例如:</p>\n<p><code>ssh root@10.0.159.150</code></p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/f0b2e40bf3ef4a6487c159e20e4cc32c_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"53_Notebook_SSH_462\\"></a>5.3 Notebook SSH</h5>\\n<p>打开 SageMaker Notebook 实例命令行界面,通过 ssh root@container_ip 进行登录,注意替换容器IP,例如:</p>\n<p><code>ssh root@10.0.159.150</code></p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/1ae39acdb4c54a9fa80b865f1726650f_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_470\\"></a><strong>总结</strong></h4>\\n<p>通过前面的演示,您可以选择任意一种方式使用Notebook或者EC2实例SSH到Amazon SageMaker 训练容器里进行探索。除了从外部环境 SSH 到训练容器,您还可以进一步修改镜像配置,允许容器之间可以互相访问,例如 DeepSpeed 多机之间需要通过SSH免密互相登录。</p>\n<h4><a id=\\"_474\\"></a><strong>本篇作者</strong></h4>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/3b86c6aec10a4ddfbd4139ddd22c2f69_image.png\\" alt=\\"image.png\\" /></p>\n<p><strong>龙斌</strong><br />\\n亚马逊云科技解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于容器和机器学习相关领域的研究。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/b77444a856a84842a14436675ce3d9dd_image.png\\" alt=\\"image.png\\" /></p>\n<p><strong>王世帅</strong><br />\\n亚马逊云科技机器学习产品技术专家,负责基于亚马逊云科技的机器学习方案的咨询与设计,专注于机器学习的推广与应用,对于云端深度学习模型分布式训练,NLP等领域有丰富经验,多次面向开发者进行云端机器学习产品的介绍与最佳实践经验分享。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭