这篇文章介绍并比较了有关如何管理 Python 包和虚拟环境的选项和推荐做法 亚马逊SageMaker Studio 笔记本。 公众 GitHub回购 为每个介绍的方法提供了实践示例。
Amazon SageMaker Studio 是用于机器学习 (ML) 的基于 Web 的集成开发环境 (IDE),可让您构建、训练、调试、部署和监控您的 ML 模型。 Studio 提供了从数据准备到实验再到生产的所有模型所需的工具,同时提高了您的工作效率。
工作室笔记本 是可以快速启动的协作 Jupyter 笔记本,因为您不需要事先设置计算实例和文件存储。 当您在 Studio 中打开笔记本时,系统会提示您通过选择 SageMaker 映像、内核、实例类型以及可选的在映像启动时运行的生命周期配置脚本来设置环境。
有关 Studio notebook 概念和体系结构其他方面的更多详细信息,请参阅 深入了解 Amazon SageMaker Studio 笔记本架构.
Studio notebook 旨在为您的 ML 开发的所有阶段提供支持,例如 ML 工作流的构思、实验和操作。 Studio自带预建 图片 包括最新的 亚马逊SageMaker Python SDK 并且,根据图像类型,其他特定的包和资源,例如 Spark、MXNet 或 PyTorch 框架库,以及它们所需的依赖项。 每个图像可以承载一个或多个 仁,可以是不同的开发虚拟环境。
为确保最适合您的开发流程和阶段、访问特定或最新的 ML 框架,或满足数据访问和治理要求,您可以自定义预构建的笔记本环境或使用您自己的图像和内核创建新环境。
这篇文章考虑了以下通过在 Studio notebook 中管理包和创建 Python 虚拟环境来自定义 Studio 环境的方法:
- 使用自定义 Studio KernelGateway 应用图像
- 使用 Studio notebook 生命周期配置
- 使用工作室 亚马逊弹性文件系统 (Amazon EFS) 卷以持久保存 Conda 环境
- 使用
pip install
Studio KernelGateway 应用程序和笔记本内核
Studio notebooks 架构的主要区别之一 SageMaker笔记本实例 是 Studio notebook 内核在 Docker 容器中运行,称为 SageMaker 镜像容器,而不是直接托管在 亚马逊弹性计算云 (Amazon EC2) 实例,SageMaker 笔记本实例就是这种情况。
下图显示了 KernelGateway、notebook 内核和 SageMaker 映像之间的关系。 (有关更多信息,请参阅 使用 Amazon SageMaker Studio 笔记本.)
由于这种差异,创建和管理方式有一些细节 Studio 笔记本中的虚拟环境,例如在内核重启之间使用 Conda 环境或 ML 开发环境的持久性。
以下部分详细解释了四种环境定制方法中的每一种,提供了实践示例,并为每个选项推荐了用例。
先决条件
要开始使用示例并自行尝试自定义方法,您需要一个活动的 SageMaker 域和域中至少一个用户配置文件。 如果您没有域,请参阅中的说明 加入 Amazon SageMaker 域.
Studio KernelGateway 自定义应用程序图像
Studio KernelGateway 应用程序映像是一个 Docker 容器,用于标识在 Studio 中运行 Jupyter notebook 所需的内核、语言包和其他依赖项。 您可以使用这些图像创建运行 Jupyter notebooks 的环境。 工作室提供了很多 内置图像 供您使用。
如果您需要不同的功能、特定框架或库包,您可以将自己的自定义图像 (BYOI) 带到 Studio。
您可以创建应用程序图像和图像版本,将图像版本附加到您的域,并使应用程序可供所有域用户或特定用户配置文件使用。 您可以通过 SageMaker 控制台管理应用程序图像, 适用于Python的AWS开发工具包 (Boto3),以及 AWS命令行界面 (AWS CLI)。 自定义图像需要存储在 Amazon Elastic Container注册 (亚马逊 ECR)存储库。
这种方法的主要好处是高水平的版本控制和 ML 运行时环境的可再现性以及库包的即时可用性,因为它们安装在映像中。 您可以实施全面的测试、治理、安全护栏和 CI/CD 自动化来生成自定义应用程序映像。 拥有开发环境的快照有助于并加强您组织的防护栏和安全实践。
提供的 笔记本 为基于 Conda 的环境实施应用程序图像创建过程。 该笔记本演示了如何创建多环境图像,以便应用程序的用户可以选择可以在其上运行笔记本的内核。
配置自定义应用程序图像
您必须将此笔记本作为 SageMaker 笔记本实例运行,以允许在本地使用 Docker 并在笔记本中运行 Docker 命令。 除了使用笔记本实例或 shell 脚本,您还可以使用 Studio 镜像构建 CLI 在 Studio 中使用 Docker。 Studio Image Build CLI 让您可以直接从您的 Studio 环境构建与 SageMaker 兼容的 Docker 镜像 AWS 代码构建.
如果您没有 SageMaker 笔记本实例,请按照中的说明进行操作 创建一个Amazon SageMaker Notebook实例 以开始浏览网页。
您还必须确保您用于笔记本实例的执行角色具有 Amazon ECR 和 SageMaker 域操作所需的权限:
要创建具有两个内核的自定义映像,每个内核都有自己的 Conda 虚拟环境,notebook 会执行以下步骤:
- 定义 Conda 环境。 Conda环境必须安装Jupyter内核包,例如,
ipykernel
对于 Python 内核。 - 定义一个 Dockerfile。 考虑自定义 SageMaker 图像 规格 创建自己的图像时。
- 构建与 Studio 兼容的 Docker 镜像并将镜像推送到 ECR 存储库。
- 创建一个 SageMaker 图像 使用 ECR 存储库中的 Docker 映像并创建初始映像版本。 每次更新 Amazon ECR 中的映像时,都必须创建一个新的映像版本。
- 更新现有的 SageMaker 域以使用此图像。 对于此操作,执行角色需要
UpdateDomain
允许。 该图像立即可供域的所有用户配置文件使用。 如果你想让图像只对特定的用户配置文件可用,你可以使用UpdateUserProfile
API调用而不是UpdateDomain
. - 实行 Studio 中的自定义图像。 启动一个新笔记本并在图像选择下拉菜单中选择新图像。
Studio 自动将图像中的 Conda 环境识别为内核选择下拉菜单中的相应内核 设置笔记本环境 小部件。
参考这些 样本笔记本 有关自定义应用程序图像实现的更多示例和用例。
清理
为避免收费,您必须停止活动的 SageMaker 笔记本实例。 有关说明,请参阅 清理.
实施自动化图像创作流程
如前所述,您可以使用 Studio 镜像构建 CLI 使用 CodeBuild 实现应用程序映像创建和部署的自动化 CI/CD 流程 sm-docker CLI. 它通过自动设置构建 Docker 映像所需的底层服务和工作流来抽象化 Docker 构建环境的设置。
推荐用例
使用 Studio 笔记本环境时,自定义应用程序图像方法非常适合以下场景:
- 用于生产或敏感开发使用的稳定和受控环境
- 无法访问 Internet 的环境,您希望将所有需要的资源和库预先打包到映像中
- 环境复用率高,环境变化率低
- 大规模数据科学运营,数十或数百名需要访问标准化自定义环境的开发人员或团队
- 使用无法在 SageMaker 第一方映像上配置的库
- 为不同的操作系统或不同的编程语言使用自定义图像的要求
- 使用自动化 CI/CD 管道的集中治理和环境开发
这种方法的局限性
这种方法需要一个多步骤的图像创建过程,包括测试,这对于较小或非常动态的环境来说可能有点过头了。 此外,考虑该方法的以下限制:
- 添加新包或创建映像的新版本需要前期工作。 作为缓解措施,您可以使用 pip 自定义现有的自定义图像,即使它不是持久的。
- 附加新的自定义图像或向域添加新版本需要
UpdateDomain
权限,通常不附加到用户配置文件执行角色。 我们建议使用具有专用执行角色的自动化管道来执行此操作,或将更新域的权限授予专用管理员用户或角色。 - 涉及图像创作的大量手动工作。 如果您经常生成和更新自定义图像,我们建议实施自动化管道。
- 如果您使用 Conda 环境,您可能会在 Docker 环境中遇到问题。 例如,请参阅 在 Dockerfile 中激活 Conda 环境. 并非所有 Conda 命令都适用于笔记本虚拟环境。 但是,这种 Studio 自定义方法并不局限于基于 Conda 的环境。
- 您无法在笔记本中手动切换 Conda 环境; 您必须在笔记本环境设置小部件中切换内核。
还要考虑有默认 配额 每个域 30 个自定义图像和每个用户配置文件 5 个图像。 这些是软限制,可以增加。
接下来的部分将介绍更轻量级的方法,这些方法可能更适合其他用例。
Studio notebook 生命周期配置
GOHAT STUDIO 生命周期配置 定义一个 shell 脚本,它在内核网关应用程序每次重新启动时运行,并且可以安装所需的包。 主要好处是数据科学家可以选择运行哪个脚本来使用新包自定义容器。 此选项不需要重建容器,并且在大多数情况下根本不需要自定义映像,因为您可以自定义 预建的.
设置生命周期配置过程
此过程大约需要 5 分钟才能完成。 该帖子演示了如何通过 SageMaker 控制台使用生命周期配置。 提供的 笔记本 展示了如何使用 Boto3 以编程方式实现相同的功能。
- 在SageMaker控制台上,选择 生命周期配置 在导航窗格中。
- 点击 GOHAT STUDIO 标签,选择 创建配置.
创建生命周期配置的第一步是选择类型。
- 对于每次创建 Jupyter 内核网关应用程序时安装依赖项的用例,请选择 Jupyter 内核网关应用程序 并选择 下一页.
- 针对 姓名, 输入配置的名称。
- 在 脚本 部分,定义内核启动时要运行的脚本。 对于此示例,将使用以下脚本安装 PyArrow 库:
- 创建配置.
现在已经创建了配置,需要将其附加到域或用户配置文件。 当附加到域时,该域中的所有用户配置文件都会继承它,而当附加到用户配置文件时,它的范围仅限于该特定配置文件。 对于本演练,我们使用 Studio 域路由。
- 域名 在导航窗格中打开您现有的域。
- 点击 环境 标签,在 个人 Studio 应用程序的生命周期配置 部分中,选择 附.
- 针对 来源, 选择 现有配置.
- 选择您创建的生命周期配置并选择 附加到域.
现在所有配置都已完成,是时候在 Studio 中测试脚本了。
- 启动 Studio 并在 发射台 标签,找到 笔记本和计算资源 部分,然后选择 改变环境 选择您创建的生命周期配置。
- 针对 启动脚本,选择您创建的生命周期配置,然后选择 选择.
- 创建笔记本.
您还可以将生命周期配置设置为默认运行 个人 Studio 应用程序的生命周期配置 条的规定, 域名 页面上发布服务提醒。
在新笔记本中,启动脚本中安装的依赖项将可用。
推荐用例
这种方法是轻量级的,但也很强大,因为它允许您通过 shell 脚本控制笔记本环境的设置。 最适合这种方法的用例如下:
- 在必须在每次内核启动时运行的笔记本生命周期配置中集成包安装。
- 无法访问互联网的环境。 使用生命周期配置来设置环境以访问本地或安全工件和包存储库,例如 AWS 代码工件.
- 如果您已经使用生命周期配置,则可以扩展它们以包括包安装。
- 在内置或自定义应用程序图像之上安装一些额外的包。
- 当您需要比自定义应用程序图像更短的上市时间时。
这种方法的局限性
主要限制是大规模管理生命周期配置脚本的工作量很大,而且安装包的速度很慢。 根据安装的软件包数量和大小,生命周期脚本甚至可能超时。 由于用户配置文件执行角色的权限,用户(例如数据科学家或 ML 工程师)的临时脚本自定义选项也有限。
请参阅 SageMaker Studio 生命周期配置示例 更多示例和用例。
将 Conda 环境保存到 Studio EFS 卷
SageMaker 域和 Studio 使用 EFS 卷作为持久存储层。 您可以在此 EFS 卷上保存您的 Conda 环境。 这些环境在内核、应用程序或 Studio 重启之间保持不变。 Studio 自动选择所有环境作为 KernelGateway 内核。
对于数据科学家来说,这是一个简单的过程,但是环境出现在可选内核列表中有 1 分钟的延迟。 对于具有不同计算要求的内核网关应用程序使用环境也可能存在问题,例如基于 GPU 的应用程序上的基于 CPU 的环境。
请参阅 SageMaker Studio 上的自定义 Conda 环境 详细说明。 该帖子的 GitHub 存储库还包含一个 笔记本 与分步指南。
在 Studio EFS 卷上创建持久性 Conda 环境
本演练大约需要 10 分钟。
- 在 Studio 上,选择 主页 在导航窗格中。
- 打开启动器.
- 在启动器中,找到 笔记本和计算资源 部分。
- 检查所选的 SageMaker 映像是否是 Conda 支持的第一方内核映像,例如“Data Science”。
- 打开图像终端 打开一个带有新内核的终端窗口。
一条消息显示“正在启动图像终端……”,片刻之后,新终端将在新选项卡中打开。
- 在终端内,运行以下命令:
这些命令将需要大约 3 分钟的时间来运行,并将在 EFS 卷上创建一个目录来存储 Conda 环境,创建新的 Conda 环境并激活它,安装 ipykernel
依赖项(没有这个依赖项,这个解决方案将不起作用),最后创建一个 Conda 配置文件(.condarc
),其中包含对新 Conda 环境目录的引用。 因为这是一个新的 Conda 环境,所以没有安装额外的依赖项。 要安装其他依赖项,您可以修改 conda install
在 Conda 环境中运行或等待以下命令完成并安装任何其他依赖项。
- 对于此示例,我们通过在终端窗口中运行以下命令来安装 NumPy 库:
现在已经创建了 Conda 环境并安装了依赖项,您可以创建一个笔记本来使用这个保存在 Amazon EFS 上的 Conda 环境。
- 在 Studio Launcher 上,选择 创建笔记本.
- 从新笔记本中,选择“Python 3(数据科学)”内核。
- 针对 核心,选择新创建的 Conda 环境,然后选择 选择.
如果一开始没有新 Conda 环境的选项,这可能是因为传播需要几分钟时间。
回到笔记本中,右上角的内核名称将发生变化,在一个单元格中,您可以测试安装的依赖项是否可用。
推荐用例
以下用例最适合这种方法:
- 无法访问 Internet 的环境,所有依赖项都预安装在持久的 Conda 环境中
- 需要内核会话之间持久性的临时环境
- 在创建 Docker 映像并推送到 Amazon ECR 之前,在 Studio 中测试自定义 SageMaker 映像
这种方法的局限性
尽管此方法具有实际用途,但请考虑以下限制:
- Amazon EFS 在处理许多小文件时可能会出现性能问题,这在管理 Python 程序包时很常见。
- 在 Studio 用户配置文件之间共享持久环境可能具有挑战性。
- 重用持久环境可能具有挑战性。
- 大规模解决管理问题可能具有挑战性。
- 该方法仅适用于特定的基于 Conda 的第一方 SageMaker 图像,例如“Data Science”、“Data Science 2.0”和“Data Science 3.0”。 有关所有可用图像的列表,请参阅 可用的 Amazon SageMaker 图像.
点安装
您可以将包直接安装到默认的 Conda 环境或默认的 Python 环境中。
创建一个 setup.py
or requirements.txt
包含所有必需依赖项的文件并运行 %pip install .-r requirement.txt
. 每次重新启动内核或重新创建应用程序时都必须运行此命令。
建议将此方法用于临时实验,因为这些环境不是持久的。
有关使用的更多详细信息 pip install
命令和限制,请参阅 在 Amazon SageMaker Studio 中安装外部库和内核.
推荐用例
这种方法是安装包以自定义笔记本环境的标准方法。 推荐的用例仅限于在笔记本中进行临时实验的非生产用途:
- Studio 笔记本中的临时实验
- 非生产和非敏感环境、沙箱环境
- 可上网的环境
这种方法的局限性
这种方法的主要限制是:
- 某些企业环境会阻止所有出口和入口互联网连接,您无法使用
pip install
拉取Python包或者需要配置离线模式 - 环境的可重复性较低
- 需要等到软件包下载并安装
- 图像重启之间没有持久性
结论
SageMaker Studio 提供范围广泛的开发环境的可能定制。 每个用户角色,例如数据科学家; ML、MLOps 或 DevOps 工程师; 管理员可以根据他们的需要、在开发周期中的位置和企业护栏来选择最合适的方法。
下表总结了所提出的方法及其首选用例和主要限制。
途径 | 坚持 | 最适合的用例 | 限制 |
带上你自己的形象 | 永久的,可在用户配置文件和域之间转移 |
|
|
生命周期配置 | 永久的,可在用户配置文件和域之间转移 |
|
|
Studio EFS 卷上的 Conda 环境 | 永久性的,不可在用户配置文件或域之间转移 |
|
|
点安装 | 瞬态,图像或 Studio 重启之间没有持久性,不可在用户配置文件或域之间转移 |
|
|
这仍然是第一天。真实世界的虚拟环境和 Python 管理远比这四种方法复杂,但这篇文章可以帮助您迈出开发自己的用例的第一步。
您可以在以下资源中找到更多用例、详细信息和实践示例:
关于作者
叶夫根尼·伊林(Yevgeniy Ilyin) 是 Amazon Web Services (AWS) 的解决方案架构师。 他在各级软件开发和解决方案架构方面拥有超过 20 年的工作经验,使用过从 COBOL 和 Assembler 到 .NET、Java 和 Python 的编程语言。 他开发和编码云原生解决方案,专注于大数据、分析和数据工程。
亚历克斯格雷斯 是 Amazon Web Services (AWS) 的解决方案架构师,负责监管金融科技数字原生业务。 Alex 常驻伦敦,与英国几家领先的金融科技公司合作,乐于支持他们使用 AWS 解决业务问题并推动未来增长。 此前,Alex 曾在伦敦的金融科技初创公司担任软件开发人员和技术主管,最近专注于 AWS 的机器学习解决方案。
- SEO 支持的内容和 PR 分发。 今天得到放大。
- 柏拉图区块链。 Web3 元宇宙智能。 知识放大。 访问这里。
- Sumber: https://aws.amazon.com/blogs/machine-learning/four-approaches-to-manage-python-packages-in-amazon-sagemaker-studio-notebooks/
- :是
- $UP
- 1
- 10
- 100
- 11
- 20 年
- 7
- 8
- a
- 关于
- 摘要
- ACCESS
- 账号管理
- 操作
- 要积极。
- Ad
- 额外
- 地址
- 管理员
- 后
- 亚历克斯
- 所有类型
- 允许
- 已经
- Amazon
- Amazon EC2
- 亚马逊SageMaker
- 亚马逊SageMaker Studio
- 亚马逊网络服务
- 亚马逊网络服务(AWS)
- 分析
- 和
- API
- 应用
- 出现
- 应用领域
- 的途径
- 方法
- 应用
- 架构
- 保健
- 围绕
- AS
- 方面
- At
- 连接
- 创作
- 自动化
- 自动
- 自动化和干细胞工程
- 可用性
- 可使用
- AWS
- 基于
- BE
- 因为
- before
- 得益
- 好处
- 最佳
- 更好
- 之间
- 大
- 大数据运用
- 阻止
- 提高
- 带来
- 广阔
- 建立
- 建筑物
- 内建的
- 商业
- 企业
- by
- 呼叫
- 被称为
- CAN
- 案件
- 例
- 挑战
- 挑战
- 更改
- 收费
- 选择
- 云端技术
- COBOL
- 共同
- 相当常见
- 相比
- 兼容
- 完成
- 复杂
- 全面
- 计算
- 概念
- 配置
- 连接
- 考虑
- 考虑
- 安慰
- 容器
- 包含
- 控制
- 受控
- 控制
- 角落
- 相应
- 可以
- 创建信息图
- 创建
- 创造
- 创建
- 习俗
- 定制
- 定制
- 周期
- data
- 数据访问
- 资料准备
- 数据科学
- 数据科学家
- 天
- 专用
- 深
- 默认
- 延迟
- 演示
- 依赖
- 根据
- 部署
- 部署
- 描述
- 设计
- 细节
- 详细
- 详情
- 开发商
- 开发
- 发展
- 研发支持
- 发展
- 差异
- 差异
- 不同
- 数字
- 直接
- 显示器
- 码头工人
- 不会
- 域
- 域名
- 别
- 下载
- 几十个
- 动态
- 每
- 效果
- 努力
- 工程师
- 工程师
- 工程师
- 确保
- 输入
- 企业
- 环境
- 环境中
- 甚至
- 所有的
- 例子
- 例子
- 执行
- 现有
- 体验
- 说明
- 延长
- 外部
- 功能有助于
- 少数
- 文件
- 档
- 终于
- 找到最适合您的地方
- 完
- fintech
- 金融科技初创企业
- fintechs
- (名字)
- 第一步
- 适合
- 专注焦点
- 遵循
- 以下
- 针对
- 骨架
- 框架
- 频繁
- 止
- 汽油
- 功能
- 此外
- 未来
- 未来成长
- 网关
- 得到
- GitHub上
- 给
- 金色的
- 非常好
- 治理
- 事业发展
- 指南
- 动手
- 有
- 有
- 帮助
- 高
- 主持人
- 托管
- 创新中心
- How To
- 但是
- HTML
- HTTP
- HTTPS
- 数百
- 识别
- 图片
- 图片
- 即时
- 立即
- 实施
- 履行
- 实施
- 器物
- 进口
- in
- 包括
- 包含
- 增加
- 信息
- 初始
- 安装
- 安装
- 安装
- 例
- 代替
- 说明
- 集成
- 网络
- 互联网接入
- 参与
- 问题
- IT
- 爪哇岛
- JPG
- 语言
- 语言
- 大
- 最新
- 发射
- 层
- 铅
- 领导
- 学习
- 让
- Level
- 各级
- 库
- 自学资料库
- 生命周期
- 轻巧
- 极限
- 限制
- 有限
- 范围
- Line
- 清单
- 本地
- 当地
- 伦敦
- 长
- LOOKS
- 低
- 机
- 机器学习
- 主要
- 使
- 管理
- 管理
- 颠覆性技术
- 管理的
- 手册
- 手动
- 许多
- 市场
- 提到
- 菜单
- 的话
- 可能
- 分钟
- 减轻
- ML
- 多播
- 模型
- 修改
- 美好瞬间
- 显示器
- 更多
- 最先进的
- 多
- 姓名
- 本地人
- 旅游导航
- 必要
- 需求
- 需要
- 净
- 全新
- 下页
- 通常
- 笔记本
- 麻木
- of
- 优惠精选
- 这一点在线下监测数字化产品的影响方面尤为明显。
- on
- 一
- 打开
- 操作
- 运营
- 附加选项
- 附加选项
- OS
- 其他名称
- 己
- 包
- 包
- 页
- 面包
- 参数
- 演出
- 性能
- 允许
- 权限
- 坚持
- 个人
- 精选
- 管道
- 地方
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 可能
- 帖子
- 强大
- 实用
- 做法
- 首选
- 呈现
- 礼物
- 先前
- 问题
- 过程
- 处理
- 生产
- 生产
- 生产率
- 本人简介
- 简介
- 代码编程
- 编程语言
- 提供
- 提供
- 提供
- 国家
- 推
- 推动
- 蟒蛇
- pytorch
- 很快
- 范围
- 率
- 宁
- 比
- 真实的世界
- 最近
- 认识
- 建议
- 建议
- 关系
- 知识库
- 要求
- 必须
- 需求
- 岗位要求
- 需要
- 资源
- 资源
- 角色
- 路线
- 运行
- 运行
- sagemaker
- 同
- 沙箱
- 保存
- 鳞片
- 情景
- 科学
- 科学家
- 科学家
- 脚本
- SDK
- 部分
- 部分
- 保安
- 选
- 选择
- 敏感
- 特色服务
- 集
- 设置
- 格局
- Share
- 壳
- 应该
- 作品
- 单
- 放慢
- 小
- 小
- So
- 软
- 软件
- 软件开发
- 方案,
- 解决方案
- 解决
- 一些
- 火花
- 专业
- 具体的
- 稳定
- 标准
- 开始
- 开始
- 启动
- 启动
- 初创企业
- 个人陈述
- 步
- 步骤
- 仍
- Stop 停止
- 存储
- 商店
- 存储
- 简单的
- 工作室
- 这样
- 合适的
- SUPPORT
- 支持
- Switch 开关
- 表
- 采取
- 需要
- 队
- 科技
- 终端
- test
- 测试
- 这
- 其
- 他们
- 博曼
- 次
- 至
- 工具
- 最佳
- 培训
- 产品培训
- 相关
- 更新
- 用法
- 使用
- 用例
- 用户
- 用户
- 版本
- 通过
- 在线会议
- 体积
- 等待
- 演练
- 方法..
- 卷筒纸
- Web服务
- 基于网络的
- 这
- 而
- WHO
- 将
- 中
- 也完全不需要
- 工作
- 工作
- 加工
- 合作
- 年
- 完全
- 您一站式解决方案
- 和风网