ONX(开放式神经网络交换) 是一种开源标准,用于表示许多提供商广泛支持的深度学习模型。 ONNX 提供了用于优化和量化模型的工具,以减少运行机器学习 (ML) 模型所需的内存和计算。 ONNX 的最大好处之一是它提供了一种标准化格式,用于在不同框架和工具之间表示和交换 ML 模型。 这允许开发人员在一个框架中训练他们的模型并将它们部署到另一个框架中,而无需进行大量的模型转换或重新训练。 由于这些原因,ONNX 在 ML 社区中获得了重要地位。
在本文中,我们展示了如何为使用 GPU 的多模型端点 (MME) 部署基于 ONNX 的模型。 这是帖子的延续 使用 Amazon SageMaker 多模型终端节点在 GPU 上运行多个深度学习模型,我们展示了如何在 Nvidia 的 Triton 推理服务器上部署 ResNet50 模型的 PyTorch 和 TensorRT 版本。 在本文中,我们使用 ONNX 格式的相同 ResNet50 模型以及 ONNX 格式的附加自然语言处理 (NLP) 示例模型来展示如何在 Triton 上部署它。 此外,我们对 ResNet50 模型进行了基准测试,并看到与使用相同输入的同一模型的 PyTorch 和 TensorRT 版本相比,ONNX 提供的性能优势。
ONNX运行时
ONNX运行时 是用于 ML 推理的运行时引擎,旨在跨多个硬件平台(包括 CPU 和 GPU)优化模型的性能。 它允许使用 ML 框架,如 PyTorch 和 TensorFlow。 它有利于 性能调优 在目标硬件上经济高效地运行模型,并支持量化和硬件加速等功能,使其成为部署高效、高性能 ML 应用程序的理想选择之一。 有关如何使用 TensorRT 针对 Nvidia GPU 优化 ONNX 模型的示例,请参阅 TensorRT 优化 (ORT-TRT) 和 ONNX 运行时与 TensorRT 优化.
亚马逊SageMaker 海卫一容器 流程如下图所示。
用户可以发送带有输入负载的 HTTPS 请求,以便在 SageMaker 端点后面进行实时推理。 用户可以指定一个 TargetModel
标头包含相关请求将要调用的模型的名称。 在内部,SageMaker Triton 容器实现了一个 HTTP 服务器,其合同与 容器如何处理请求. 它支持动态批处理并支持所有 Triton 提供的后端. 根据配置,调用 ONNX 运行时,并按照用户提供的模型配置中预定义的 CPU 或 GPU 处理请求。
解决方案概述
要使用 ONNX 后端,请完成以下步骤:
- 将模型编译为 ONNX 格式。
- 配置模型。
- 创建 SageMaker 端点。
先决条件
确保您有足够的权限访问 AWS 账户 AWS身份和访问管理 IAM 权限以创建笔记本、访问 亚马逊简单存储服务 (Amazon S3) 存储桶,并将模型部署到 SageMaker 端点。 看 创建执行角色 获取更多信息.
将模型编译为 ONNX 格式
transformers 库提供了将 PyTorch 模型编译为 ONNX 格式的便捷方法。 以下代码实现了 NLP 模型的转换:
通过作为 Hugging Face 转换器存储库的一部分提供的转换工具,可以轻松导出模型(PyTorch 或 TensorFlow)。
以下是幕后发生的事情:
- 从转换器(PyTorch 或 TensorFlow)分配模型。
- 通过模型转发虚拟输入。 这样,ONNX 可以记录运行的操作集。
- 导出模型时,转换器本质上会处理动态轴。
- 将图形与网络参数一起保存。
torchvision 模型动物园的计算机视觉用例遵循类似的机制:
配置模型
在本节中,我们配置计算机视觉和 NLP 模型。 我们展示了如何创建一个 ResNet50 和 RoBERTA 大型模型,该模型已经过预训练,可以通过利用 Triton 推理服务器模型配置部署在 SageMaker MME 上。 ResNet50 笔记本可在 GitHub上. RoBERTA 笔记本也可在 GitHub上. 对于 ResNet50,我们使用 Docker 方法创建一个环境,该环境已经具有构建我们的 ONNX 模型和生成本练习所需的模型工件所需的所有依赖项。 这种方法使得共享依赖关系和创建完成此任务所需的确切环境变得更加容易。
第一步是根据中指定的目录结构创建 ONNX 模型包 ONNX 模型. 我们的目标是将最小模型存储库用于包含在单个文件中的 ONNX 模型,如下所示:
接下来,我们创建 车型配置 描述 Triton 服务器的输入、输出和后端配置的文件,用于为 ONNX 选取和调用适当的内核。 这个文件被称为 config.pbtxt
并显示在 RoBERTA 用例的以下代码中。 请注意, BATCH
尺寸从省略 config.pbtxt
. 但是,在将数据发送到模型时,我们包括了批次维度。 以下代码还展示了如何使用模型配置文件添加此功能,以设置动态批处理,并将首选批处理大小设置为 5 以用于实际推理。 使用当前设置,当满足首选批处理大小 5 或自第一个请求到达动态批处理程序以来已过去 100 微秒的延迟时间时,将立即调用模型实例。
以下是计算机视觉用例的类似配置文件:
创建 SageMaker 端点
我们使用 Boto3 API 创建 SageMaker 端点。 对于这篇文章,我们展示了 RoBERTA notebook 的步骤,但这些是常见的步骤,对于 ResNet50 模型也是一样的。
创建 SageMaker 模型
我们现在创建一个 SageMaker 模型。 我们使用 Amazon Elastic Container注册 (Amazon ECR) 图像和上一步创建 SageMaker 模型的模型工件。
创建容器
要创建容器,我们拉 合适的形象 来自用于 Triton 服务器的 Amazon ECR。 SageMaker 允许我们自定义和注入各种环境变量。 一些关键特性是能够设置 BATCH_SIZE
; 我们可以在每个模型中设置这个 config.pbtxt
文件,或者我们可以在这里定义一个默认值。 对于可以受益于更大共享内存大小的模型,我们可以在下面设置这些值 SHM
变量。 要启用日志记录,请设置日志 verbose
水平到 true
. 我们使用以下代码创建要在端点中使用的模型:
创建 SageMaker 端点
您可以使用具有多个 GPU 的任何实例进行测试。 在本文中,我们使用 g4dn.4xlarge 实例。 我们不设置 VolumeSizeInGB
参数,因为此实例带有本地实例存储。 这 VolumeSizeInGB
参数适用于支持 Amazon Elastic Block商店 (Amazon EBS) 卷附件。 我们可以将模型下载超时和容器启动健康检查保留为默认值。 有关详细信息,请参阅 创建端点配置.
最后,我们创建一个 SageMaker 端点:
调用模型端点
这是一个生成模型,所以我们传入 input_ids
和 attention_mask
作为有效载荷的一部分添加到模型中。 以下代码显示了如何创建张量:
我们现在通过确保数据类型与我们在 config.pbtxt
. 这也为我们提供了包含批次维度的张量,这正是 Triton 所期望的。 我们使用 JSON 格式来调用模型。 Triton 还为模型提供了原生二进制调用方法。
注意 TargetModel
前面代码中的参数。 我们将要调用的模型的名称作为请求标头发送,因为这是一个多模型端点,因此我们可以通过更改此参数在运行时在已部署的推理端点上调用多个模型。 这显示了多模型端点的强大功能!
要输出响应,我们可以使用以下代码:
用于性能调优的 ONNX
ONNX 后端使用 C++ arena 内存分配。 Arena 分配是一个仅限 C++ 的功能,可帮助您优化内存使用并提高性能。 内存分配和释放构成了协议缓冲区代码中花费的 CPU 时间的很大一部分。 默认情况下,新对象的创建会为每个对象、它的每个子对象和几个字段类型(例如字符串)执行堆分配。 这些分配在解析消息和在内存中构建新消息时批量发生,相关的释放发生在消息及其子对象树被释放时。
基于竞技场的分配旨在降低这种性能成本。 使用 arena 分配,新对象从一大块预分配的内存中分配出来,称为 竞技场. 可以通过丢弃整个竞技场来一次释放所有对象,理想情况下不运行任何包含对象的析构函数(尽管竞技场仍然可以在需要时维护析构函数列表)。 这通过将对象分配减少为简单的指针增量来加快对象分配,并使释放几乎免费。 Arena 分配还提供了更高的缓存效率:当消息被解析时,它们更有可能被分配在连续的内存中,这使得遍历消息更有可能命中热缓存行。 基于 arena 的分配的缺点是 C++ 堆内存将被过度分配并且即使在对象被释放后仍保持分配状态。 这可能会导致内存不足或 CPU 内存使用率过高。 为了实现两全其美,我们使用以下提供的配置 Triton 和 ONNX:
- 竞技场扩展策略 – 此参数是指用于根据模型大小增加内存空间的策略。 我们建议将该值设置为 1 (=
kSameAsRequested
),这不是默认值。 推理如下:默认竞技场扩展策略的缺点(kNextPowerOfTwo
) 是它可能会分配比需要更多的内存,这可能是一种浪费。 顾名思义,kNextPowerOfTwo
(默认)以 2 的幂扩展竞技场,而kSameAsRequested
每次扩展与分配请求相同的大小。kSameAsRequested
适用于您提前知道预期内存使用情况的高级配置。 在我们的测试中,因为我们知道模型的大小是一个常数值,所以我们可以放心地选择kSameAsRequested
. - GPU内存限制 – 我们将该值设置为 CUDA 内存限制。 要使用所有可能的内存,请传入最大值
size_t
. 它默认为SIZE_MAX
如果没有指定。 我们建议将其保留为默认值。 - 启用CPU内存竞技场 – 这会启用 CPU 上的内存区域。 竞技场可能会预先分配内存以供将来使用。 将此选项设置为
false
如果你不想要它。 默认是True
. 如果禁用 arena,堆内存分配将需要时间,因此推理延迟会增加。 在我们的测试中,我们将其保留为默认值。 - 启用内存模式 – 该参数是指基于输入形状的内部内存分配策略。 如果形状是常量,我们可以启用这个参数来为以后生成一个内存模式,节省一些分配时间,使其更快。 使用 1 启用内存模式,使用 0 禁用。 当预期输入特征相同时,建议将此设置为 1。 默认值为 1。
- do_copy_in_default_stream – 在 ONNX 中的 CUDA 执行提供程序的上下文中,计算流是在 GPU 上异步运行的一系列 CUDA 操作。 ONNX 运行时根据它们的依赖关系在不同的流中调度操作,这有助于最大限度地减少 GPU 的空闲时间并获得更好的性能。 我们建议使用默认设置 1 来使用相同的流进行复制和计算; 但是,您可以使用 0 来使用单独的流进行复制和计算,这可能会导致设备流水线化这两个活动。 在我们对 ResNet50 模型的测试中,我们同时使用了 0 和 1,但在 GPU 设备的性能和内存消耗方面找不到两者之间的任何明显差异。
- 图优化 – Triton 的 ONNX 后端支持多个参数,这些参数有助于微调模型大小以及已部署模型的运行时性能。 当模型转换为 ONNX 表示时(IR 阶段下图中的第一个框),ONNX 运行时提供三个级别的图形优化:基本、扩展和布局优化。 您可以通过在模型配置文件中添加以下参数来激活所有级别的图形优化:
- cudnn_conv_algo_search – 因为我们在测试中使用基于 CUDA 的 Nvidia GPU,对于我们使用 ResNet50 模型的计算机视觉用例,我们可以在下图中的第四层使用基于 CUDA 执行提供程序的优化
cudnn_conv_algo_search
范围。 默认选项是详尽的(0),但是当我们将此配置更改为1 – HEURISTIC
,我们看到稳定状态下的模型延迟减少到 160 毫秒。 发生这种情况的原因是因为 ONNX 运行时调用了更轻的重量 cudnnGetConvolutionForwardAlgorithm_v7 前向传递,因此以足够的性能减少延迟。 - 运行方式 – 下一步是选择正确的 执行模式 在下图中的第 5 层。 此参数控制您是要在图形中顺序运行运算符还是并行运行运算符。 通常当模型有很多分支时,将此选项设置为
ExecutionMode.ORT_PARALLEL
(1) 会给你更好的表现。 在您的模型在其图形中有许多分支的场景中,将运行模式设置为并行将有助于提高性能。 默认模式是顺序的,因此您可以启用它以满足您的需要。
为了更深入地了解 ONNX 中性能调优的机会,请参考下图。
基准数字和性能调整
通过打开图形优化, cudnn_conv_algo_search
和并行运行模式参数在我们测试 ResNet50 模型时,我们看到 ONNX 模型图的冷启动时间从 4.4 秒减少到 1.61 秒。 下面的 ONNX 配置部分提供了完整模型配置文件的示例 笔记本.
测试基准测试结果如下:
- PyTorch – 176 毫秒,冷启动 6 秒
- 张量RT – 174 毫秒,冷启动 4.5 秒
- 昂尼克斯 – 168 毫秒,冷启动 4.4 秒
下图可视化了这些指标。
此外,在我们对计算机视觉用例的测试中,考虑使用 Triton 提供的 HTTP 客户端以二进制格式发送请求负载,因为它显着改善了模型调用延迟。
SageMaker 在 Triton 上为 ONNX 暴露的其他参数如下:
- 动态批处理 – 动态批处理是 Triton 的一项功能,它允许服务器组合推理请求,以便动态创建批处理。 创建一批请求通常会导致吞吐量增加。 动态批处理程序应用于无状态模型。 动态创建的批次分发到为模型配置的所有模型实例。
- 最大批量大小 ——由数百家创建、维护和提供物联网(IoT)全球开放标准的公司所组成的
max_batch_size
属性指示模型支持的最大批量大小 批处理的类型 可以被Triton利用。 如果模型的批量维度是第一个维度,并且模型的所有输入和输出都有这个批量维度,那么 Triton 可以使用它的 动态批处理 or 序列批处理程序 自动对模型使用批处理。 在这种情况下,max_batch_size
应设置为大于或等于 1 的值,这表示 Triton 应与模型一起使用的最大批量大小。 - 默认最大批量大小 – default-max-batch-size 值用于
max_batch_size
,我们将参加 自动完成 当找不到其他值时。 这onnxruntime
后端将设置max_batch_size
如果自动完成已确定模型能够批处理请求,则将模型设置为此默认值,并且max_batch_size
在模型配置中为 0 或max_batch_size
从模型配置中省略。 如果max_batch_size
大于 1 并且没有 调度 提供时,将使用动态批处理调度程序。 默认最大批处理大小为 4。
清理
确保在运行笔记本后删除模型、模型配置和模型端点。 示例笔记本末尾提供了执行此操作的步骤 GitHub上 回购。
结论
在本文中,我们深入探讨了 Triton 推理服务器在 SageMaker 上支持的 ONNX 后端。 此后端为您的 ONNX 模型提供 GPU 加速。 要获得最佳推理性能,需要考虑许多选项,例如批量大小、数据输入格式和其他可以调整以满足您的需求的因素。 SageMaker 允许您使用单模型和多模型端点来使用此功能。 MME 可以更好地平衡性能和成本节约。 要开始使用 MME 对 GPU 的支持,请参阅 在一个端点后面的一个容器中托管多个模型.
我们邀请您在 SageMaker 中试用 Triton 推理服务器容器,并在评论中分享您的反馈和问题。
关于作者
阿比希瓦蒂亚 是 AWS 的高级解决方案架构师,与战略性全球企业组织合作,促进 AWS 服务在人工智能、分布式计算、网络和存储等领域的采用。 他的专长在于自然语言处理 (NLP) 和计算机视觉领域的深度学习。 Abhi 协助客户在 AWS 生态系统中高效部署高性能机器学习模型。
詹姆斯公园 是 Amazon Web Services 的解决方案架构师。 他与 Amazon.com 合作,在 AWS 上设计、构建和部署技术解决方案,并且对人工智能和机器学习特别感兴趣。 在业余时间,他喜欢探索新文化、新体验,并紧跟最新的技术趋势。您可以在 LinkedIn.
鲁宾德·格鲁瓦尔 是 AWS 的高级人工智能/机器学习专家解决方案架构师。 他目前专注于在 SageMaker 上提供模型和 MLOps。 在担任此职务之前,他曾担任机器学习工程师构建和托管模型。 工作之余,他喜欢打网球和在山路上骑自行车。
达瓦尔·帕特尔 是 AWS 的首席机器学习架构师。 他曾与从大型企业到中型初创公司的组织合作,解决与分布式计算和人工智能相关的问题。 他专注于深度学习,包括 NLP 和计算机视觉领域。 他帮助客户在 SageMaker 上实现高性能模型推理。
- SEO 支持的内容和 PR 分发。 今天得到放大。
- EVM财务。 去中心化金融的统一接口。 访问这里。
- 量子传媒集团。 IR/PR 放大。 访问这里。
- 柏拉图爱流。 Web3 数据智能。 知识放大。 访问这里。
- Sumber: https://aws.amazon.com/blogs/machine-learning/host-ml-models-on-amazon-sagemaker-using-triton-onnx-models/
- :具有
- :是
- :不是
- :在哪里
- $UP
- 1
- 100
- 11
- 13
- 14
- 16
- 20
- 200
- 22
- 224
- 7
- 9
- a
- 对,能力--
- ACCESS
- 完成
- 账号管理
- 实现
- 实现
- 横过
- 活动
- 实际
- 加
- 添加
- 额外
- 采用
- 推进
- 高级
- 后
- AI
- AI / ML
- 瞄准
- 所有类型
- 分配
- 分配
- 分配
- 让
- 允许
- 沿
- 已经
- 还
- Amazon
- 亚马逊SageMaker
- 亚马逊网络服务
- Amazon.com
- an
- 和
- 另一个
- 任何
- APIs
- 相应
- 应用领域
- 的途径
- 适当
- 保健
- 地区
- 竞技场
- 人造的
- 人工智能
- AS
- 助攻
- 相关
- At
- 自动
- 可使用
- AWS
- 轴
- 背部
- 后端
- 当前余额
- 基于
- 基本包
- BE
- 因为
- 很
- 背后
- 基准
- 得益
- 好处
- 最佳
- 更好
- 之间
- 最大
- 阻止
- 身体
- 都
- 盒子
- 分支机构
- 建立
- 建筑物
- 但是
- by
- C + +中
- 缓存
- 被称为
- CAN
- 能力
- 关心
- 案件
- 例
- 变
- 改变
- 查
- 选择
- 客户
- 码
- 冷
- COM的
- 结合
- 购买的订单均
- 注释
- 相当常见
- 社体的一部分
- 相比
- 完成
- 计算
- 一台
- 计算机视觉
- 计算
- 配置
- 考虑
- 常数
- 消费
- 包含
- 容器
- 集装箱
- 包含
- 上下文
- 延续
- 连续
- 合同的
- 控制
- 便捷
- 转化
- 转换
- 仿形
- 正确
- 价格
- 节约成本
- 可以
- 创建信息图
- 创建
- 创造
- 创建
- 电流
- 目前
- 合作伙伴
- 定制
- data
- 日期
- 深
- 深入学习
- 更深
- 默认
- 默认
- 延迟
- 部署
- 部署
- 部署
- 部署
- 设计
- 设计
- 详情
- 决心
- 开发
- 设备
- 差异
- 不同
- 尺寸
- 分布
- 分布式计算
- do
- 码头工人
- 域名
- 别
- 鸽子
- 下载
- 缺点
- ,我们将参加
- 动态
- 动态
- 每
- 更容易
- 容易
- 生态系统
- 效率
- 高效
- 有效
- 或
- enable
- 使
- 结束
- 端点
- 发动机
- 工程师
- 保证
- 企业
- 企业
- 整个
- 环境
- 等于
- 甚至
- 例子
- 例子
- 交换
- 执行
- 锻炼
- 预期
- 预计
- 体验
- 专门知识
- 剥削
- 延长
- 扩展
- 广泛
- 面部彩妆
- 促进
- 功能有助于
- 因素
- 快
- 专栏
- 特征
- 反馈
- 部分
- 数字
- 文件
- 档
- 找到最适合您的地方
- (名字)
- 流
- 重点
- 其次
- 以下
- 如下
- 针对
- 格式
- 向前
- 发现
- 第四
- 分数
- 骨架
- 框架
- 自由的
- 止
- 此外
- 未来
- 获得
- 生成
- 生成的
- 得到
- 给
- 全球
- GPU
- 图形处理器
- 图形
- 图表
- 更大的
- 增长
- 发生
- 发生
- 硬件
- 有
- he
- 健康管理
- 帮助
- 帮助
- 相关信息
- 高
- 高性能
- 他
- 他的
- 击中
- 兜帽
- 主持人
- 托管
- 热卖
- 创新中心
- How To
- 但是
- HTML
- HTTP
- HTTPS
- 理想
- 身分
- 空闲
- if
- 图片
- 器物
- 进口
- 重要性
- 改善
- in
- 包括
- 包括
- 包含
- 增加
- 增加
- 增量
- 表示
- 信息
- 本质
- 注入
- 输入
- 输入
- 例
- 即刻
- 房源搜索
- 兴趣
- 内部
- 内部
- 成
- 邀请
- 调用
- 所调用
- IT
- 它的
- JPG
- JSON
- 保持
- 键
- 键
- 类
- 知道
- 已知
- 语言
- 大
- 大企业
- 大
- 潜伏
- 最新
- 层
- 布局
- 铅
- 学习
- 离开
- 左
- Level
- 各级
- 自学资料库
- 谎言
- 打火机
- 喜欢
- 容易
- 极限
- 线
- 清单
- 本地
- 日志
- 记录
- 机
- 机器学习
- 保持
- 制作
- 制作
- 许多
- 最大
- 最多
- 可能..
- 机制
- 满足
- 内存
- 提到
- 的话
- 条未读消息
- 一半
- 方法
- 指标
- 可能
- 最小
- ML
- 多播
- 时尚
- 模型
- 模型
- 更多
- 山
- 许多
- 多模型端点
- 多
- 姓名
- 本地人
- 自然
- 自然语言处理
- 需求
- 打印车票
- 需要
- 网络
- 工业网络
- 神经网络
- 全新
- 下页
- NLP
- 没有
- 笔记本
- 没什么
- 现在
- 数字
- 麻木
- Nvidia公司
- 对象
- 对象
- of
- on
- 一旦
- 一
- 开放源码
- 运营
- 运营商
- 机会
- 优化
- 优化
- 优化
- 追求项目的积极优化
- 附加选项
- 附加选项
- or
- 组织
- 其他名称
- 我们的
- 输出
- 产量
- 学校以外
- 包
- 并行
- 参数
- 参数
- 部分
- 特别
- 通过
- 模式
- 性能
- 施行
- 权限
- 挑
- 片
- 平台
- 平台
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 播放
- 可能
- 帖子
- 功率
- 首选
- 以前
- 校长
- 先
- 问题
- 处理
- 处理
- 财产
- 协议
- 提供
- 提供者
- 供应商
- 提供
- pytorch
- 题
- 有疑问吗?
- 范围
- 达到
- 实时的
- 原因
- 原因
- 建议
- 建议
- 记录
- 减少
- 减少
- 减少
- 指
- 问候
- 地区
- 有关
- 知识库
- 表示
- 代表
- 请求
- 要求
- 必须
- 响应
- 导致
- 成果
- 角色
- 运行
- 运行
- 安然
- sagemaker
- 同
- 保存
- 储
- 锯
- 脚本
- 秒
- 部分
- 看到
- 寻求
- 选择
- 提交
- 发送
- 前辈
- 分开
- 序列
- 服务
- 特色服务
- 服务
- 集
- 设置
- 设置
- 几个
- 形状
- 形状
- Share
- 共用的,
- 应该
- 显示
- 展示
- 显示
- 如图
- 作品
- 显著
- 显著
- 类似
- 简易
- 自
- 单
- 尺寸
- 尺寸
- So
- 解决方案
- 一些
- 专家
- 指定
- 花费
- 阶段
- 标准
- 开始
- 开始
- 启动
- 初创企业
- 州/领地
- 留
- 稳定
- 步
- 步骤
- 仍
- 存储
- 善用
- 策略
- 流
- 流
- 结构体
- 这样
- 足够
- 提示
- 如下
- SUPPORT
- 支持
- 支持
- 支持
- 采取
- 目标
- 任务
- 专业技术
- tensorflow
- 条款
- 测试
- 比
- 这
- 未来
- 图
- 其
- 他们
- 然后
- 那里。
- 因此
- 博曼
- 他们
- Free Introduction
- 那些
- 虽然?
- 三
- 通过
- 吞吐量
- 次
- 至
- 工具
- 工具
- 火炬视
- 培训
- 转换
- 变形金刚
- 树
- 趋势
- 海卫一
- 尝试
- 谈到
- 二
- 类型
- 类型
- 一般
- 下
- 理解
- us
- 用法
- 使用
- 用例
- 用过的
- 用户
- 使用
- 运用
- 平时
- 利用
- 折扣值
- 价值观
- 各个
- 愿景
- 体积
- 想
- 废物回收
- 方法..
- we
- 卷筒纸
- Web服务
- 重量
- 井
- 什么是
- ,尤其是
- 而
- 是否
- 这
- 广泛
- 将
- 中
- 也完全不需要
- 工作
- 工作
- 加工
- 合作
- 世界
- 完全
- 您一站式解决方案
- 和风网
- 动物园