# OpenBayes 贝式计算 · 产品文档 > 让计算更简单 — GPU 算力容器、数据仓库、模型部署、HPC、自动建模、CLI 等产品文档。 This file contains all documentation content in a single document following the llmstxt.org standard. ## 面向 AI / LLM 的文档访问 为方便你借助 AI 助手理解和使用 OpenBayes,我们的文档提供了若干「AI 友好」的访问方式:既可以一键复制当前页面的 Markdown,也提供了符合 [llms.txt 标准](https://llmstxt.org/)的机器可读索引,供 AI Agent / IDE 直接摄取。 ## 复制为 Markdown 每个文档页面的右上角(面包屑右侧)都有一个 **「复制为 Markdown」** 按钮。点击后会把**当前页面**转换成干净的 Markdown 复制到剪贴板——代码块、数学公式、提示框、表格等都会被正确保留,并附上来源链接。 随后你可以直接粘贴到 ChatGPT、Claude、Kimi、DeepSeek 等对话框中,让它基于这页文档回答问题、生成代码或排查问题。 ## llms.txt 与 llms-full.txt 我们在构建时自动生成两个站点级文件: - **[/llms.txt](pathname:///llms.txt)** —— 文档索引。按章节列出全部文档标题、简介,以及每页对应的 Markdown 地址,符合 llmstxt.org 标准。 - **[/llms-full.txt](pathname:///llms-full.txt)** —— 全文合集。把所有文档拼接为单个 Markdown 文件,可整体作为上下文喂给大模型(文件较大,适合长上下文模型)。 ## 每页的 Markdown 版本 除了页面上的复制按钮,每个文档页都还有一份对应的 `.md` 纯文本版本,其地址都列在 [`/llms.txt`](pathname:///llms.txt) 中。如果你在自动化脚本或 Agent 中按 URL 抓取文档,使用这些 `.md` 比解析 HTML 更省 token、也更稳定。 ## 在 AI 工具中使用 - **Claude Code / Cursor 等编码 Agent**:把 `https://openbayes.com/llms.txt`(或某一页的 `.md` 地址)作为上下文提供给它,它即可参照 OpenBayes 文档帮你编写在平台上运行的代码、配置容器或排查部署问题。 - **ChatGPT / Claude / Kimi 等网页版**:在你正在阅读的页面点击「复制为 Markdown」后直接粘贴;如果想让它了解全部文档,可粘贴 [`/llms-full.txt`](pathname:///llms-full.txt) 的内容。 :::tip 这些内容会随文档更新自动重新生成,无需手动维护。如果你在使用中发现 AI 给出的信息过时或有误,欢迎通过页面右下角的反馈入口告诉我们。 ::: --- ## 如何制作一个好的数据集 ## 序 在开始面对一个深度学习问题或者一个需要解决的场景的时候,我们最常遇到的问题就是“没有数据”。没有数据、数据杂乱、数据没有标注、标注质量不高,都在解决这个问题之前,先挡在了我们的面前。针对这样的问题,本节内容,我们来为大家介绍一下如何制作一个好的数据集,希望能为各位同学提供帮助。 ## 开始之前 我制作一个数据集之前,我们要做什么呢? 在开始制作一个数据集之前,我们首先要回答这样几个问题: * 我们的场景解决中需要解决什么样的问题? * 解决这样的问题需要什么样的数据? * 有没有公开的数据集和我们的场景相似? * 我们在一个单位之间内,能收集到多少数据? * 标注一个单位的数据,需要花费多大的代价? ## 制作步骤 ### 确定任务 在解决问题和制作数据集之前,我们要做的第一步就是确定我们的任务是什么。如果没有清楚明白的了解我们要解决的任务,我们后面的工作都会直接浪费。 在确定任务的时候,首先要明确我们的场景,是从什么样的输入,到什么样的输出。明确了输入输出,我们就能大概知道,我们面对的是一个什么问题。 明确面对的问题之后,将其拆解成一个或多个算法问题。假设已经拥有这些算法模型,看能不能按照流程解决问题,如果可以,就开始规划如何训练对应的算法,以及制作算法模型所需要的数据集。 ### 设计数据分布 数据集中的场景是根据任务的目标设定的,针对任务中可能出现的识别目标和识别场景,一般会考虑中英文、黑白色彩、天气、内容分布。 ### 划分数据集 训练集是用来训练算法模型,通过输入输出学习神经网络等模型的参数权重。 验证集是用来在这些中间模型中挑选在验证数据中表现最好的模型。 测试集是用于评估使用训练数据集训练得到的算法的效果。 用生活的情况举个例子: * 训练集相当于学生的课本:学生根据课本里的内容来掌握知识。 * 验证集相当于学生的作业:通过作业可以知道不同学生学习情况、进步的速度快慢。 * 测试集相当于最终的考试:考的题是平常都没有见过,考察学生举一反三的能力。 在得到原始数据集之后,我们需要对其进行划分,一份采样不能同时出现在训练集、验证集和测试集中。一般情况下,我们采取6:2:2的划分方式,每一部分中应尽可能全的包含各种数据场景。 ![](/img/docs/automl/dataset_split.png) ### 标注数据 标注数据集的工具不是这篇文章的主要内容,下面只列举一些开源项目: * https://github.com/wkentaro/labelme * https://github.com/scalabel/scalabel ### 整理数据集格式 将标注好的数据集,按照文件夹整理,建议单文件夹不放置超过1000个文件。然后制作元信息文件 “meta.csv”。 ```meta.csv``` 是 OpenBayes 数据规范格式的元信息文件,具体格式讲解见:[数据格式规范介绍](/docs/automl/data-format) ## 制作数据集会遇到的问题 ### 1. 需要多少数据? 所有的项目都是独一无二的,我们理想的状况是数据是模型参数数量的10倍。任务越复杂,需要的数据就越多。 ### 2. 我已经有数据集了,下面做什么? 不要着急开始。你需要先了解已有的数据集,并且一定能发现错误、无效、混乱的地方,先把它们修理好。数据集的质量决定了你后面做机器学习项目的每一步。 ### 3. 如果我没有足够的数据怎么办? 如果有开源且场景相近的数据集,那么可以合并使用。如果场景特殊,就先梳理业务场景,做好打点,收集数据。 --- ## 数据格式:图像分类 ## 介绍 图像分类作为最基础的视觉图像问题,我们对它的数据集格式定义也最为基础。在 ```meta.csv``` 文件中,每一行表示一张图片的记录,一张图片对应一个分类。 ### 样例 ```csv title="train_meta.csv" category_Label,image_Source dog,images/001.jpg cat,images/002.jpg ``` ## FAQ 1. 每一张图片只能对应一个类别标签 2. 在使用的过程中,我们会对类别标签按照字典序排列,用作区分和展示 --- ## OpenBayes 自动建模数据格式规范介绍 ## 介绍 **OpenBayes 数据格式**是 OpenBayes 定义的一套数据集格式整理标准,用于 OpenBayes 自动建模等相关产品。按照本规范数据集格式之后,自动建模可以使用该数据集自动构建深度学习模型。 OpenBayes 数据格式以 meta.csv 为数据集的主要格式文件,文件以 csv 格式为主体: * 第一行为字段类型和字段名称,格式为:[类型]_[名称] * 第二行以及以后每一行为数据样本。 ## 字段名称 1. 字段名称使用大小写英文字母命名。 2. 以“*”号为首的字段会忽略,自动建模训练过程会忽略该字段。 3. *Label* 作为专属字段,专指训练数据中的标签,字段名称中只能有一个字段名是 *Label*。 ## 字段类型 **字段类型**表示该列字段的数据类型,其中包括简单字段:int、float、category、txt,简单字段的值就是 meta.csv 中每一行对应列的值。另一类是复杂字段:text、image、video、json,复杂字段因为无法在 meta.csv 中表示,所以复杂字段对应的值是一个相对路径,表示该字段的值在数据集中对应的文件。 - int - 整数值 - float - 浮点数 - category - 分类值 - txt - 短文本值 - text - 文本文件,文件中的全部内容 - image - 图片文件,格式包括:jpg、png、tif - video - 视频文件,格式包括:mp4 - json - 复杂标注数据,根据不同的问题,会有对应的定义方式 ## 各类问题的数据格式 ### 目标检测 目标检测由于 Label 字段内容多,所以使用单独的 Json 文件作为标注,001.jpg 是一张原图,001.json 则是改图中若干个物体标注和对应类型。 ``` json_Label,image_Source labels/001.json,images/001.jpg ``` 详细描述见[目标检测](/docs/automl/data-format/object-detection) ### 语义分割 001_mask.jpg 和 001.jpg 是相同大小的两张图片,001_mask.jpg 中每个像素是 001.jpg 对应位置的标注。 ``` image_Label,image_Source images/001_mask.jpg,images/001.jpg ``` ### 实例分割 实例分割 ## FAQ 1. 标注的文件名和文件内容中,最好只使用英文、数字、下划线等字符。避免出现中文,以防止非预期的编码问题。 2. 标注规范中的坐标全部是相对位置坐标,如下图,坐标点是(X/800, Y/600) ![](/img/docs/automl/data_format_xy.png) --- ## 数据格式:实例分割 ## 介绍 实例分割是在目标检测数据格式的基础上,对两点框增加了对检测框中掩膜(mask)的边界定位,使用 JSON 文件作为标注,001.jpg 是一张原图,001.json 则是该图中若干个实例分割的标注和对应标签。 ### 样例 ```csv title="train_meta.csv" json_Label,image_Source labels/001.json,images/001.jpg ``` 实例分割的 JSON 标注内容,是标注框和对应的内容和属性,标注框包括分为两点框和掩膜(mask)边界: - 两点框是左上角(x_min 和 y_min)和右下角(x_max 和 y_max)两个点 - mask 是从区域左上点开始顺时针方向的若干个点坐标,闭合图案表示该物体的形状。 所有标注坐标使用的是点在图片上的相对位置,例如:图片大小(800, 600),点坐标(10,30),则标注框的表示为(10/800,30/600),即(0.125,0.05)。 ## 字段说明 - image_width - 该图片的宽度 - image_height - 该图片的高度 - image_path - 该图片文件的相对路径 - num_box - 该图片上的标注框数目 - bboxes - 该图片上的标注框列表 - attributions - 数据集自定义使用的属性值(训练不使用,但是有保留意义的标注) - label - 该框的标注标签 - x_min / y_min - 两点框左上角坐标 - x_max / y_max - 两点框右下角坐标 - x_arr - Mask 边缘点依次 x 坐标 - y_arr - Mask 边缘点依次 y 坐标 ### 实例分割标注样例 ```json { "num_box": 1, "bboxes": [ { "id": 0, "attributions": { "group": 2 }, "label": "people", "x_max": 0.08816, "x_min": 0.00001, "y_max": 0.20833, "y_min": 0.00001, "x_arr": [0.0, 0.0, 0.0861, 0.0875, 0.2083, 0.2097, 0.3292, 0.3306, 0.4514, 0.4528, 0.57222, 0.5736, 0.6347, 0.6347], "y_arr": [0.0, 0.0652, 0.0652, 0.0707, 0.0706, 0.0761, 0.0761, 0.0815, 0.0815, 0.0869, 0.0869, 0.0924, 0.0924, 0.0] } ], "image_height": 2019, "image_width": 2048, "image_path": "images/1.jpg" } ``` --- ## 数据格式:目标检测 ## 介绍 目标检测由于 Label 字段内容多,所以使用单独的 JSON 文件作为标注,001.jpg 是一张原图,001.json 则是该图中若干个目标物体的标注和对应标签。 ### 样例 ```csv title="meta.csv" json_Label,image_Source labels/001.json,images/001.jpg ``` 目标检测的 JSON 标注内容,是标注框和对应的内容和属性,标注框包括分为两点框和四点框: - 两点框是左上角(x_min 和 y_min)和右下角(x_max 和 y_max)两个点 - 四点框是从任一点(左上点)开始顺时针方向的4个点坐标。四点框可以是矩形框也可以是一般四边形 标注坐标使用的是点在图片上的相对位置,例如:图片大小(800, 600),点坐标(10,30),则标注框的表示为(10/800,30/600),即(0.125,0.05)。 ## 字段说明 - image_width - 该图片的宽度 - image_height - 该图片的高度 - image_path - 该图片文件的相对路径 - num_box - 该图片上的标注框数目 - bboxes - 该图片上的标注框列表 - attributions - 数据集自定义使用的属性值(训练不使用,但是有保留意义的标注) - label - 该框的类型标注 - x_min / y_min - 两点框左上角坐标 - x_max / y_max - 两点框右下角坐标 - x_arr - 四点框四点依次 x 坐标 - y_arr - 四点框四点依次 y 坐标 ### 两点框标注样例 ```json { "num_box": 2, "bboxes": [ { "attributions": { "group": 0 }, "id": 0, "label": "ball", "x_max": 0.853887, "x_min": 0.700299, "y_max": 0.099826, "y_min": 0.050272 }, { "attributions": { "group": 0 }, "id": 1, "label": "ball", "x_max": 0.719806, "x_min": 0.692791, "y_max": 0.163233, "y_min": 0.110261 } ], "image_path": "8/ballet_106_0.jpg", "image_width": 600, "image_height": 419, } ``` ### 四点框标注样例 ```json { "num_box": 2, "bboxes": [ { "id": 0, "attributions": { "group": 0 }, "label": "ball", "x_arr": [ 0.700982, 0.853886, 0.853203, 0.700299], "y_arr": [ 0.050271, 0.055058, 0.099825, 0.095039] }, { "id": 1, "attributions": { "group": 0 }, "label": "ball", "x_arr": [ 0.698083, 0.719805, 0.714512, 0.692790], "y_arr": [ 0.110260, 0.115165, 0.163232, 0.158328] } ], "image_path": "8/ballet_106_0.jpg", "image_width": 600, "image_height": 419, } ``` --- ## 数据格式:语义分割 ## 介绍 语义分割是一个识别图像中内容和位置的图像问题,通常是要识别目标在图像中的所有像素。在定义数据格式的时候,每一张图片对应一张图片标注,一一对应,图片中的像素表示对该图片对应像素的标记。 标注的图片中,背景的标记为0,每一个类型的标注分别为1,2,3... 以此类推。 ### 样例 ```csv title="train_meta.csv" image_Label,image_Source label/001.jpg,images/001.jpg label/002.jpg,images/002.jpg ``` ## FAQ 1. 源图片和标注图片的尺寸和方向要完全一致 --- ## 自动建模介绍 在这里介绍通过使用 OpenBayes 自动建模模块,开发者可以快速训练出一个深度学习模型,解决对应的深度学习问题。开发者需要将自己数据集的格式转换成 OpenBayes 数据格式,然后按照步骤使用自动建模模块,通过对应的默认模型或基于默认模型的自动调参,得到一个指标最好的模型。 ## 快速尝试 为了方便说明,我们以目标检测问题为例进行使用说明,并使用一个公开数据集进行自动建模功能。选取左侧“自动建模”,并点击“创建新自动建模”按钮,开启一个自动建模作业。 ### 创建新自动建模 进入新建自动建模界面,填写对应信息,并在“解决问题”一项中,选择“目标检测”问题。 ![](/img/docs/automl-index-1.png) ### 绑定数据 我们已经准备了公开数据集“缺陷检测”用来展示。在绑定数据项目中,```input0``` 是为自动建模准备的公开预训练模型,能加速训练过程;```input1``` 是默认选择的缺陷数据集,在使用过程中,可以根据自身的需求调整 ```input1``` 的绑定对象。 ![](/img/docs/automl-index-2.png) ### 配置 在配置界面,上方会展示之前页面的信息,这部分只用来展示,不能修改。下半部分是配置选项,“选择算力”目前提供的是 NVIDIA V100 显卡和 NVIDIA A100 显卡的算力类型;“最大尝试次数”是指在自动建模的过程中,学习过程中的总尝试次数,自动建模将在指定次数内找到一个此范围内的最优模型;“并行个数”是指同时启动的 GPU 训练实例个数,这个参数收个人权限影响。“高级设置”中的初始化参数是关于数据集的设定参数,用户必须填写的是数据集图片的宽高。 完成配置之后,点击“运行”,启动自动建模作业。 ![](/img/docs/automl-index-3.png) ### 结果展示 开始运行之后,直至完成所有的执行尝试之后,我们可以通过概览界面查看该任务的基本信息、执行状态和每一次尝试执行的结果。 ![](/img/docs/automl/automl_2021_08_03_x4.png) ![](/img/docs/automl/automl_2021_08_03_x5.png) --- ## 自动建模解决问题总览 ## 介绍 在创建一个自动建模任务的时候,需要选择这个任务要解决的问题。在本节中,我们将会对 OpenBayes 自动建模系统能解决的问题逐一进行说明。 ## 问题列表 * 目标检测 * openbayes-object-detection - 见[目标检测](/docs/automl/solutions/object-detection) --- ## 目标检测 ## 介绍 目标检测是用来识别图片中目标的类别以及位置,是图像视觉领域中经常遇到的问题。针对目标检测问题,我们提供了自动建模解决方案,让用户能够自行解决遇到的目标检测问题。 ![目标检测图示](/img/docs/automl/object_detection_demo.png) ## 评价指标 ### mAP - mean Average Precision mAP 表示各类别 AP 的平均值,而 AP 是 PR 曲线下面积,关于 AP 的解释和具体计算方法参考:https://github.com/rafaelpadilla/Object-Detection-Metrics#average-precision ## 参数讲解 |参数|说明| |:-- |:-- | | image_height | (必填)图片高度 | | image_width| (必填)图片宽度 | | train_meta | (必填)训练集 csv 文件路径 | | val_meta | (必填)验证集 csv 文件路径 | | test_meta | (选填)测试集 csv 文件路径 | | early_stopping_step | (选填)提前停止训练步数,默认是10 | ## 实战样例 在这个部分我们会结合数据格式,对几个问题样例进行效果说明。 ### 缺陷检测 本问题是在 PCB 板上查找缺陷点的问题,通过目标检测定位缺陷的位置。使用自动建模训练学习,在大约100小时之内,找到的最优模型,其评估指标 mAP 达到 0.9756。 ![缺陷检测图示](/img/docs/automl/PCB_detect_demo.jpeg) ### 木材检测 本问题是对自然场景中的卡车,进行木材检测,目的是识别卡车上木材的个数和位置,经过自动建模的训练学习,mAP 达到 0.9452。 ![木材检测图示](/img/docs/automl/wood_detect_demo.jpg) --- ## OpenBayes 配置文件 ## 为执行提供默认的参数 OpenBayes 配置文件(`openbayes.yaml`)与命令行工具结合使用,可以大大简化重复的命令的输入。 当使用命令行工具时,可以通过命令参数的形式将所需要的「环境」「资源」「数据集」等信息传递进来,例如: ```bash bayes gear run task \ --env=pytorch-2.0 \ # 指定运行时环境 --resource=t4 \ # 指定所使用的资源,通过命令 bayes gear resource 可以在 USAGE 字段看到命令 --data openbayes/mnist/1:/input0 \ # 所要绑定的数据 -- python main.py # 入口命令 ``` 通过 `openbayes.yaml` 可以为当前目录下运行任务提供默认的命令,例如我们定义一个内容如下的 `openbayes.yaml`: ```yaml data_bindings: - data: openbayes/mnist/1 path: /input0 type: ro resource: t4 env: pytorch-2.0 command: "python main.py" ``` 只需在当前目录输入以下命令即可实现同样的任务执行效果: ```bash bayes gear run task ``` ## `openbayes.yaml` 字段描述与规格 `openbayes.yaml` 目前分为两部分: 1. 基本类型的参数,包括 `data_bindings` `resource` `env` `command` `parameters` 五个 2. 自动调参的参数,包含在 `hyper_tuning` 具体的内容在 [自动调参](/docs/hypertuning/) 中介绍 ### data_bindings 指绑定的数据,支持「容器输出」以及「数据集」,由 `data` 和 `path` 两部分组成。 #### data `data` 指绑定的数据源。如果绑定的是一个「数据集版本」,推荐使用以下形式: ``` // ``` 例如要绑定 OpenBayes 下的 MNIST 数据集第一个版本,其 `data` 字段可以写为: `openbayes/mnist/1` 如果绑定的是一个「容器输出」,推荐使用以下形式: ``` /jobs//output ``` 如绑定 OpenBayes 下的 test-project 容器下的 `jfaqJeLMcPM` 的输出,其形式为: ``` openbayes/jobs/jfaqJeLMcPM/output ``` 其中: - `owner`:资源所属用户名 - `dataset-ref`:数据集标识,推荐使用数据集 ID - `job-ref`:Job 标识,推荐使用 Job ID - `version`:数据集版本号,通常为数字 :::tip 如果你是在页面中选择绑定源,系统会自动填充可用标识;如果你是手工编写 `openbayes.yaml`,推荐优先使用 ID,而不是名称,以避免空格、转义或歧义问题。 ::: #### path 另一部分为 `path` 指将数据源具体绑定到容器中的哪个目录,目前支持的目录如下: - /input0 - /input1 - /input2 - /input3 - /input4 - /output 也兼容以下 `openbayes` 路径写法: - `/openbayes/home` 等价于 `/output` - `/openbayes/input/input0` 等价于 `/input0` - `/openbayes/input/input1` 等价于 `/input1` - `/openbayes/input/input2` 等价于 `/input2` - `/openbayes/input/input3` 等价于 `/input3` - `/openbayes/input/input4` 等价于 `/input4` ### 数据绑定的两种配置方式 在 `openbayes.yaml` 中,您可以使用以下两种方式之一来配置数据绑定: 1. **使用 `data_bindings`(详细配置方式)**: ```yaml data_bindings: - data: openbayes/mnist/1 # 数据集的完整路径 path: /input0 # 挂载到容器中的路径 type: ro # 可选:ro(只读)或 rw(可读写) - data: openbayes/jobs/jfaqJeLMcPM/output path: /output type: rw ``` 2. **使用 `bindings`(简写方式)**: ```yaml # 不写绑定权限默认为只读绑定 bindings: - openbayes/eBIQp4yPMtU/1:/input0 - openbayes/jobs/jfaqJeLMcPM/output:/output # 也可以指定读写绑定 bindings: - username/data-cli-2/5:/input0:rw - username/data-1/1:/output:rw ``` :::info 需要注意的是 `openbayes/eBIQp4yPMtU/1:/input0` 中,**`openbayes` 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 `openbayes` 替换为你的用户名**,`eBIQp4yPMtU` 是数据集 ID,`1` 是数据集的版本号;`:/input0`,是将数据集绑定到 input0 中。 ::: 这两种方式是等价的,您可以根据需要选择使用。 ### 数据绑定权限控制说明 - `ro`:只读权限,适用于参考数据集 - `rw`:读写权限,适用于需要保存结果的输出目录 :::caution 注意 只读路径,绑定过来的数据源无法更改,但其绑定速度非常快。`/output` 为工作目录,虽然有读写权限,但将数据绑定到 `/output` 目录中会有额外的数据拷贝时间,在保存容器时也会产生额外的存储用量。因此需要用户在自己的场景下决定绑定的目录。 ::: :::tip - 使用 `bayes gear bindings` 命令可以查看可绑定的数据列表 ::: :::caution - 确保指定的数据集版本存在 - 确保您有权限访问指定的数据集 - 挂载路径不要使用重复的值 - 同一个任务中,`/output`、`/input0` ~ `/input4` 不能重复使用 ::: ### resource 指使用什么算力容器,通过命令 `bayes gear resource` 可以看到支持的算力类型。 ### env 指使用什么运行时环境,通过命令 `bayes gear env` 可以查看支持的运行时环境。 ### command 只有在创建「脚本执行」时需要,指任务执行时的入口命令。 ### parameters 在创建一个 task 或者 jupter 执行时,可以通过 `parameters` 传入一组 `key / value` 形式的参数,这个参数主要的作用有以下两点: 1. 方便记录这次执行的重要参数,`parameters` 会在执行的界面中展示出来 ![](/img/docs/2019-12-09-14-57-29.png) 2. 将自定义的参数传递到执行中,同时支持两种形式: - `parameters` 的内容会在执行初始化时生成一个文件 `openbayes_params.json` 方便程序通过该文件读取内部参数: ![](/img/docs/2019-12-09-15-01-32.png) - `parameters` 的内容会以命令行参数的形式追加到入口命令后面,例如 `openbayes.yaml` 中有如下内容: ```yaml ... command: python main.py parameters: input: /input0 epochs: 5 ... ``` 那么真正的执行入口命令将会是 ```bash python main.py --input=/input0 --epochs=5 ``` :::info **Secret 是网页控制台的能力**:在容器创建页的「环境变量」区域,可以把单个变量标记为 Secret(脱敏显示、保存后不可读、不写入 `openbayes_params.json`),详见 [环境变量与 Secret 变量](/docs/gear/env-vars)。 配置文件中的 `parameters` **不支持 Secret**,这里填写的值都会以明文写入 `openbayes_params.json` 并追加到入口命令,请勿在 `parameters` 中放置密钥、Token 等敏感信息。 ::: ## 用命令行参数覆盖配置文件中的参数 同时,也可以通过命令行覆盖相应的参数,例如对于上文中的 `openbayes.yaml` 通过以下命令可以覆盖入口执行的命令: ```bash bayes gear run task -- sleep 360 ``` 那么提交的命令内容将不再是 `python main.py` 而是 `sleep 360`。 --- ## 命令行工具 bayes 基本介绍 OpenBayes 提供了一个命令行工具 `bayes` 方便在命令行界面直接与 OpenBayes 服务之间进行交互。相比直接在 web 界面进行交互,命令行工具在「创建 Python 脚本」「上传数据集」等诸多方面会更加简单和高效。 ## 安装 OpenBayes CLI 现在使用 Python 编写,您可以通过 Python 的包管理器 pip 来安装。在 [安装 bayes 命令行工具](/docs/cli/install/) 中详细介绍了安装步骤。 安装完成后,您可以通过以下命令验证安装: ```bash $ pip show openbayes-cli ``` 这将显示 CLI 工具的版本、安装位置、依赖等详细信息。然后使用以下命令验证 CLI 工具是否可以正常工作: ```bash $ bayes status ``` 如果安装成功,该命令将显示您的连接状态和基本系统信息。 在命令行中看到如上的信息说明 `bayes` 工具已经安装成功了,接下来可以通过命令 `bayes login` 登录账号: ```bash $ bayes login username 请输入 username 的密码: username 已成功登入 openbayes ``` 然后我们通过 `bayes -h` 可以查看具体能做什么操作: ```bash $ bayes -h Usage: bayes [OPTIONS] COMMAND [ARGS]... OpenBayes 命令行工具 ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ --install-completion Install completion for the current shell. │ │ --show-completion Show completion for the current shell, to copy it or customize the installation. │ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ data 数据集相关操作 │ │ gear 容器相关操作 │ │ hpc 高性能计算相关操作 │ │ login 登录 │ │ logout 注销 │ │ org 组织相关操作 │ │ ssh SSH 相关操作 │ │ status 登录信息 │ │ switch 切换服务端环境 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` 使用 "bayes [命令] --help" 获取更多有关此命令的信息。 ### 获取子命令的帮助信息 您可以通过添加 `--help` 或 `-h` 参数来获取任何子命令的详细帮助信息。例如,查看数据集相关操作的帮助信息: ```bash $ bayes data -h Usage: bayes data [OPTIONS] COMMAND [ARGS]... 数据集相关操作 ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ create 创建一个新的数据集 │ │ ls 显示用户的数据集 │ │ new-version 创建一个新的空的数据集版本 │ │ open 在浏览器打开数据集页面 │ │ upload 上传本地数据到数据集 │ │ versions 显示用户的数据集的版本列表 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` 同样地,您可以查看容器相关操作的帮助信息: ```bash $ bayes gear -h Usage: bayes gear [OPTIONS] COMMAND [ARGS]... 容器相关操作 ╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ --help -h Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ bindings 查看运行容器可绑定的数据 │ │ download 下载容器输出 │ │ env 查看运行容器可选的环境 │ │ init 初始化容器 │ │ logs 查看容器日志 │ │ ls 查看所有容器 │ │ open 在浏览器打开容器页面 │ │ resource 查看运行容器可选的资源 │ │ restart 继续执行容器 │ │ run 运行容器 │ │ status 查看容器下的所有任务 │ │ stop 停止容器 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` ## 快速开始 ### 登录 ```bash $ bayes login username 请输入 username 的密码: username 已成功登入 OpenBayes 若需使用 SSH,请重新调用 bayes ssh init 命令 ``` 按照提示,执行命令 `bayes ssh init` 增加 ssh 配置,方便通过 ssh 访问容器。更多信息见 [通过 SSH 连接运行中的 Jupyter 执行](/docs/gear/ssh/)。 ### 初始化容器 新建一个目录,并在该目录初始化一个新的容器: ```bash $ mkdir new-bayes-test $ cd new-bayes-test $ bayes gear init new-bayes-test 容器初始化成功 ``` 罗列当前目录: ```bash $ ls -a . .. .openbayesgear .openbayesignore openbayes.yaml ``` 可以看到生成了三个文件: - `.openbayesgear` 保存了当前容器的元信息,请勿删除。 - `.openbayesignore` 与 `.gitignore` 类似,用于在上传数据或者上传代码的时候忽略目录中不希望上传的内容,详细的文档可以参见 [gitignore](https://git-scm.com/docs/gitignore)。 - `openbayes.yaml` openbayes 命令行的配置文档,详情见 [OpenBayes 配置文件](/docs/cli/config-file/)。 ### 创建一个 Python 脚本任务 创建一个简单的 `main.py` 文件: ```bash $ cat < main.py import time for i in range(100): time.sleep(1) print(i) print('done') EOF ``` 执行命令: ```bash $ bayes gear run task -f -- python main.py 当前正在个人账号 admin 上进行操作... command 信息为: python main.py 正在上传源代码... 正在准备上传源代码... 正在获取上传授权... 开始扫描文件,请稍候... 共发现 5 个文件,总计 10.3 kB,开始上传... 上传进度: 100% (5/5): 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10.3k/10.3k [00:05<00:00, 2.04kB/s] ✅ 源代码上传成功! 已上传 5 个文件 正在向服务器请求创建容器... 容器创建成功 打开网页 https://openbayes.com/console/admin/jobs/ia0j6m6fzp1l 可查看容器的详细信息 容器运行中 ``` 其中容器日志如下: ```bash bayes cmd exists. /usr/local/bin/bayes 已成功切换到 bayes 若需使用 SSH,请重新调用 bayes ssh init 命令 已成功登入 OpenBayes 若需使用 SSH,请重新调用 bayes ssh init 命令 已成功切换到个人账号 admin curl: (5) Could not resolve proxy: alchemist-experience proxy alchemist-experience:7890 not working, ignoring 0 1 2 ... 95 96 97 98 99 done ``` 更多信息见 [用 bayes 管理容器](/docs/cli/managing-containers/)。 ## 升级 您可以通过以下命令升级到最新版本: ```bash $ pip install --upgrade openbayes-cli ``` 如果您希望直接从官方 PyPI 源升级,避免使用本地缓存和第三方镜像,可以使用以下命令: ```bash # 不使用缓存 $ pip install --upgrade openbayes-cli --no-cache-dir # 使用官方 PyPI 源 $ pip install --upgrade openbayes-cli --index-url https://pypi.org/simple ``` ## 使用哲学 `bayes` 命令行工具意在补充 web 界面部分操作的不足,提升部分更适合在命令行界面进行的操作的体验;而不是为了让用户完全脱离 web 界面独立使用的。尤其是在数据集的创建、Python 脚本的创建相比于 web 界面的操作流程有非常大的提升。后面我们重点介绍这两个场景。 命令行工具会提供很多命令方便用户从命令行界面切换到 web 界面查看容器或者数据的内容。反过来,未来 web 端也会增加更多的命令行操作提示,方便用户在两个界面间穿梭。 ## 在 Jupyter 工作空间中使用命令行工具 目前命令行工具已经集成到了 Jupyter 工作空间中,在 Jupyter 中打开「Terminal(命令行终端)」后会出现如下的提示: ![](/img/docs/2019-12-19-13-36-13.png) 按照提示输入命令 `bayes gear init` 后自动完成账号的登录,并初始化 `openbayes.yaml` 文件(更多配置文件的信息见[OpenBayes 配置文件](/docs/cli/config-file/))。 --- ## 安装 bayes 命令行工具 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import DistroLinks from '@site/src/components/CliDistroList'; 在这个文档中您将了解到如何安装 OpenBayes 的 CLI 命令行工具 `bayes`。 ## 通过 pip 安装 `bayes` OpenBayes CLI 现在使用 Python 编写,您可以通过 Python 的包管理器 pip 来安装。在安装之前,请确保您的系统已经安装了 Python(推荐 Python 3.7 或更高版本)。 使用以下命令安装最新版本的 OpenBayes CLI: ```bash pip install openbayes-cli ``` 如果您想安装特定版本,可以使用: ```bash pip install openbayes-cli==<版本号> ``` 如果您希望直接从官方 PyPI 源安装,避免使用本地缓存和第三方镜像,可以使用以下命令: ```bash # 安装最新版本(不使用缓存) pip install --upgrade openbayes-cli --no-cache-dir # 安装特定版本(使用官方 PyPI 源) pip install --upgrade openbayes-cli==<版本号> --index-url https://pypi.org/simple ``` 这些命令对于确保获取最新版本或解决安装问题特别有用。 安装完成后,您可以通过以下步骤验证安装: 1. 使用 pip 查看安装的包信息: ```bash pip show openbayes-cli ``` 这将显示 CLI 工具的版本、安装位置、依赖等详细信息。 2. 验证 CLI 工具是否可以正常工作: ```bash bayes status ``` 如果安装成功,该命令将显示您的连接状态和基本系统信息。 ## 升级 `bayes` 要升级到最新版本,请运行: ```bash pip install --upgrade openbayes-cli ``` ## 下一步… 当您安装好 CLI 客户端后,接下来您可能感兴趣的是: - [通过 CLI 登录](/docs/cli/login/) - 如何通过 CLI 命令行工具登录 OpenBayes - [CLI 指令一览](/docs/cli/reference/bayes/) - 查看 `bayes` 所支持的所有指令 --- ## 通过 bayes 登录 OpenBayes ## 前提要求 - 您必须已拥有一个 OpenBayes 账号 - 您的 OpenBayes 账号必须可以正常登录 - `bayes` CLI 工具已在您的电脑上 [正确安装](/docs/cli/) ## 通过令牌登录(推荐) 推荐使用令牌(Token)进行登录,尤其适用于 CI/CD 流水线、脚本自动化等无交互场景。 您可以在 OpenBayes [个人设置](https://openbayes.com/console/profile) 页面获取您的 API 令牌。 ### 方式一:通过命令行参数登录 直接将令牌作为参数传递给 `bayes login`: ```bash $ bayes login username 已成功登入 openbayes ``` ### 方式二:通过环境变量登录 设置 `OPENBAYES_TOKEN` 环境变量后,CLI 会自动读取并完成认证,无需手动执行 `bayes login`: ```bash export OPENBAYES_TOKEN= ``` 如果需要同时指定组织,可以配合 `OPENBAYES_ORG` 和 `OPENBAYES_USER` 环境变量使用: ```bash export OPENBAYES_TOKEN= export OPENBAYES_USER= export OPENBAYES_ORG= ``` ## 通过用户名和密码登录 ```bash $ bayes login 请输入用户名: username 请输入 username 的密码: username 已成功登入 openbayes ``` ## 切换到组织 如果你有加入其他组织,也可以通过 bayes 切换到某一个组织进行操作。 首先查看当前的组织列表: ```bash $ bayes org ls ROLE ID NAME MEMBER open-tutorials open-tutorials ``` 然后切换到组织 `open-tutorials`: ```bash $ bayes org switch open-tutorials 已成功切换到组织 open-tutorials ``` 和 OpenBayes 的 Web 页面类似,当 bayes 切换到某一个组织后,其所看到的容器、数据仓库等信息都是当前组织的而不是个人的了。 通过命令 `bayes status` 可以看到自己当前所在的组织: ```bash $ bayes status 当前环境: https://openbayes.com 当前组织: open-tutorials 用户名: openbayes 邮箱: xxx@openbayes.com ``` 如果想要切换回自己的个人账户,则可以使用 `bayes org switch ` 来实现。 ## 登出当前账号 ```bash $ bayes logout 已成功登出 ``` CLI 会记住您当前的用户名信息,下次登录时,再次输入密码即可: ```bash $ bayes login 请输入 username 的密码: username 已成功登入 openbayes ``` 如果您希望切换登录账号,需要在登录时指定用户名: ```bash $ bayes login herobcat 请输入 herobcat 的密码: herobcat 已成功登入 openbayes ``` --- ## 用 bayes 管理容器 `bayes` 命令行下有「工作目录」的概念,它对应着 OpenBayes 容器中的「输出」目录。通过命令行工具创建容器时需要首先把一个本地目录当作「工作目录」并与 OpenBayes 的「容器」建立映射关系,具体操作如下: 1. 切换到需要执行的代码所在的目录 `cd ~/openbayes-mnist-example` 2. 初始化一个新的容器 `bayes gear init mnist-example` 此时当前目录已经和 mnist-example 这个容器创建了映射关系,创建的「执行」都会出现在该容器下面 :::note 使用 ` bayes gear ls` 命令,可以查看你的所有容器 ::: `bayes gear init` 命令可以使用已存在的容器名称或容器 ID 对当前目录进行容器初始化,若使用一个不存在的容器名称进行初始化,会创建一个新的容器。 准备工作完成之后,我们将来介绍一下几种接入方式的使用 ## 通过命令行参数创建「Python 脚本执行」 通过命令 `bayes gear run task -h` 可以看到大量的样例提示如何创建一个「Python 脚本执行」。 我们这里先创建一个比较简单的版本: ``` $ bayes gear run task --env=pytorch-2.0 -- python main.py 当前正在组织 org1 上进行操作... task_command 信息为: python main.py 正在上传源代码... 正在准备上传源代码... 正在获取上传授权... 开始扫描文件,请稍候... 共发现 9 个文件,总计 13.3 kB,开始上传... 上传进度: 100% (9/9): 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 13.3k/13.3k [00:00<00:00, 44.0kB/s] ✅ 源代码上传成功! 已上传 9 个文件 正在向服务器请求创建容器... 容器创建成功 打开网页 https://openbayes.com/console/org1/jobs/fpyx2l77wtvh 可查看容器的详细信息 ``` 其中 `--` 之后为执行的具体的命令,如果有 `&&` 这样的符号,需要用引号进行保护 `bayes gear run task -- 'echo 123 && python main.py'`。 可以看到 `bayes` 将当前目录的文件上传并创建了一个「python 脚本」任务。 ![](/img/docs/bayes-managing-containers-1.png) 然后,我们尝试通过命令行参数,创建一个复杂一点的版本: ``` bayes gear run task \ --resource cpu \ --env pytorch-2.0 \ --data openbayes/eBIQp4yPMtU/1:/input0 \ --data openbayes/sTggKplxyT6/1:/input1 \ --data openbayes/bbNaMvDNqO9/1:/input2 \ --data username/jobs/3s55ypc33ptl/output:/output \ --message "task message" \ --open \ --follow \ -- sleep 60 ``` 介绍一下几个可用的参数: - `-e` 或 `--env` 选择镜像,可供选择的镜像可以通过命令 `bayes gear env` 查询 - `-r` 或 `--resource` 选择算力,可供选择的算力可以通过命令 `bayes gear resource` 查询 - `-d` 或 `--data` 绑定数据,可供绑定的数据集可以通过命令 `bayes gear bindings` 查询 - `-m` 或 `--message` 执行描述,可留空 - `-o` 或 `--open` 将会在容器开始运行后,在浏览器打开相应的 web 界面 - `-f` 或 `--follow` 跟踪运行容器的状态 :::info 需要注意的是 `--data openbayes/eBIQp4yPMtU/1:/input0` 中, **`openbayes` 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 `openbayes` 替换为你的用户名**,`eBIQp4yPMtU` 是数据集 ID,`1` 是数据集的版本号;`:/input0`,是将数据集绑定到 input0 中。 ::: ## 通过 openbayes.yaml 创建「Python 脚本执行」 另外,在通过 `bayes gear init` 将当前目录和容器绑定后目录下会出现文件 `openbayes.yaml` 内部初始化内容如下: ```yaml title="openbayes.yaml" ## 有关「 OpenBayes 配置文件」的最新说明,请查阅 https://openbayes.com/docs/cli/config-file/ ## data_bindings # 指绑定的数据,支持「容器输出」以及「数据集」,最多同时绑定三个 # # 一个完整的 data_bindings 样例如下: # # data_bindings: # - data: openbayes/mnist/1 # path: /input0 # type: ro # - data: openbayes/jobs/jfaqJeLMcPM/output # path: /output # type: rw # # 亦可将 data_bindings 替换成 bindings, 简写成如下样例: # # bindings: # - openbayes/mnist/1:/input0 # - openbayes/mnist/1:/input1:rw # - openbayes/jobs/jfaqJeLMcPM/output:/output # data_bindings: [] ## resource # 指使用什么算力容器,通过命令 bayes gear resource 可以看到支持的算力类型 # resource: "rtx-4090" ## env # 指使用什么运行时环境,通过命令 bayes gear env 可以查看支持的运行时环境 # env: "pytorch-2.6-2204" ## command # 只有在创建「脚本执行」时需要,指任务执行时的入口命令 # command: "" ## node # 指定运行节点数量 # node: 1 ## parameters # 支持 key / value 形式的参数,该参数会在容器执行时生成 openbayes_params.json 并补充在 command 参数后面 # 样例如下: # # parameters: # input: /input0 # epochs: 5 # # 在执行时会生成一个内容为 {"input": "/input0", "epochs": 5} 的 openbayes_params.json, # 并且会在执行命令后面追加 `--input=/input0 --epochs=5` # parameters: {} ## 有关「 OpenBayes 自动调参」的最新说明,请查阅 https://openbayes.com/docs/hypertuning/ # # 一个完整的 hyper_tuning 样例如下: # hyper_tuning: # max_job_count: 3 # hyperparameter_metric: precision # goal: MINIMIZE # algorithm: Bayesian # parameter_specs: # - name: regularization # type: DOUBLE # min_value: 0.001 # max_value: 10.0 # scale_type: UNIT_LOG_SCALE # - name: latent_factors # type: INTEGER # min_value: 5 # max_value: 50 # scale_type: UNIT_LINEAR_SCALE # - name: unobs_weight # type: DOUBLE # min_value: 0.001 # max_value: 5.0 # scale_type: UNIT_LOG_SCALE # - name: feature_wt_factor # type: DOUBLE # min_value: 1 # max_value: 200 # scale_type: UNIT_LOG_SCALE # - name: level # type: DISCRETE # discrete_values: [1, 2, 3, 4] # - name: category # type: CATEGORICAL # categorical_values: ["A", "B", "C"] # hyper_tuning: ## max_job_count # 一次自动调参的尝试次数,最多支持 100 次 # max_job_count: 0 ## parallel_count # 并行的尝试个数受限于用户的单个资源类型的最大并行个数,通常是 1 或者 2 # parallel_count: "1" ## hyperparameter_metric # 目标变量 # 有关目标变量的上报,请查阅 https://openbayes.com/docs/hypertuning/#2-上报目标变量 hyperparameter_metric: "" ## goal # 最优解的方向 ( MAXIMIZE 或 MINIMIZE ) # goal: "" ## algorithm # 采用的算法,支持的算法如下: # Grid 对于只有 DISCRETE 以及 CATEGORICAL 类型参数的场景可以通过 GridSearch 遍历所有参数的组合 # Random 针对 INTEGER 以及 DOUBLE 类型,依据其所支持的分布类型,在 min_value 和 max_value 之间随机选择数值,对于 DISCRETE 和 CATEGORICAL 类型,其行为和 Grid 方式类似 # Bayesian 每次生成参数时考虑之前的「参数」-「目标变量」的结果,通过更新后的分布函数提供参数以期望获取更好的结果,其算法可以参考该文章 # algorithm: "" ## parameter_specs # 输入参数的规约 # 参数规约的定义请查阅:https://openbayes.com/docs/hypertuning/#参数规约的定义 # parameter_specs: [] ## side_metrics # 其他参考指标 # side_metrics: [] ``` 其中 `hyper_tuning` 部分暂不介绍,但可以看到其他参数与 `bayes gear run task` 中使用的参数是一致的,通过在 `openbayes.yaml` 配置参数可以避免重复在使用 `bayes gear run task` 时重复输入参数。例如提供如下参数: ```yaml data_bindings: - data: openbayes/mnist/1 # 数据集的完整路径 path: /input0 # 挂载到容器中的路径 type: ro # 可选:ro(只读)或 rw(可读写) resource: rtx-4090 env: pytorch-2.0 command: "python train.py -i /input0 -o ./model -e 2 -m model.h5 -l ./tf_dir" ``` :::info 需要注意的是 `openbayes/mnist/1` 中,**`openbayes` 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 `openbayes` 替换为你的用户名**,`mnist` 是数据集的名字,`1` 是数据集的版本号。 ::: 直接输入 `bayes gear run task` 命令即可执行一个在 `pytorch-2.0` 环境下,算力资源为 `rtx-4090`,绑定数据集 `openbayes/mnist/1` 到 `/input0`,入口命令为 `python train.py -i /input0 -o ./model -e 2 -m model.h5 -l ./tf_dir` 的任务了。 :::note 更多有关配置文件如何编写的内容,见 [OpenBayes 配置文件](/docs/cli/config-file/) ::: ## 创建「Jupyter 工作空间」 与「Python 脚本」的创建类似,通过命令行创建 Jupyter 默认会把当前目录下的文件上传到容器的「输出」中。 1. `git clone https://github.com/practicalAI/practicalAI` 下载 practicalAI 项目 2. `cd practicalAI && bayes gear init practicalAI` 初始化容器 3. `bayes gear run workspace` 创建 Jupyter ``` $ bayes gear run workspace -o -f 当前正在组织 org1 上进行操作... 正在向服务器请求创建容器... 容器创建成功 打开网页 https://openbayes.com/console/org1/jobs/52yaekv8nf91 可查看容器的详细信息 已成功打开浏览器. 容器运行中 ``` :::note 「Jupyter 工作空间」的创建和与「Python 脚本」的创建类似,可以通过命令行参数创建,也可以通过 openbayes.yaml 文件创建。 ::: ## 容器继续执行 - 使用 `bayes gear status` 命令,查看当前容器下的所有执行 - 使用 `bayes gear restart ` 命令,传入已完成执行的 ID,可以以相同的参数再次运行该次执行。 ``` $ bayes gear restart 52yaekv8nf91 -o -f 当前正在组织 org1 上进行操作... 容器继续执行... 打开网页 https://openbayes.com/console/org1/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息 已成功打开浏览器. ⠸ CREATED ``` 亦可以通过参数覆盖,修改部分参数,再次运行该次执行。 :::note `restart` 命令的选项与 `run` 命令的选项一致 ::: ``` $ bayes gear restart 52yaekv8nf91 \ --resource cpu \ --env pytorch-2.0 \ --data openbayes/eBIQp4yPMtU/1:/input0 \ --data openbayes/sTggKplxyT6/1:/input1 \ --data openbayes/bbNaMvDNqO9/1:/input2 \ --data username/jobs/3s55ypc33ptl/output:/output \ --message "task message" \ --open \ --follow 当前正在组织 org1 上进行操作... 容器继续执行... 打开网页 https://openbayes.com/console/org1/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息 已成功打开浏览器. 容器运行中 ``` :::info 需要注意的是 `--data openbayes/eBIQp4yPMtU/1:/input0` 中,**`openbayes` 是公有数据集的专用名,如果你想使用你自己的数据集,需要将 `openbayes` 替换为你的用户名**,`eBIQp4yPMtU` 是数据集 ID,`1` 是数据集的版本号;`:/input0`,是将数据集绑定到 input0 中。 ::: ## 关闭容器执行 使用 `bayes gear stop` 命令,传入运行中的容器执行 ID,可以关闭容器的该次执行。 ``` $ bayes gear stop 52yaekv8nf91 -o -f 当前正在组织 org1 上进行操作... 同步数据并关闭容器 打开网页 https://openbayes.com/console/username/jobs/52yaekv8nf91 可查看容器 practicalAI 的详细信息 已成功打开浏览器. 容器已关闭 ``` 介绍一下几个可用的参数: - `-o` 或 `--open` 将会在容器开始关闭后,在浏览器打开相应的 web 界面 - `-f` 或 `--follow` 会一直跟踪容器的状态,直到容器完全关闭 ## 用命令行工具下载容器输出内容 ### 1. 直接通过执行 ID 下载容器输出内容 使用 `bayes gear download` 命令,传入容器执行 ID,可以下载该容器的当前输出内容。 ``` $ bayes gear download 5mx0ki1s5ej8 --target ~/Downloads/data-download-location -u 当前正在组织 org1 上进行操作... 正在下载中,请稍候 下载完成,文件保存在 ~/Downloads/data-download-location/cli-29.output.zip 正在解压中,请稍候 解压成功: 文件已解压到 ~/Downloads/data-download-location 已删除源文件: ~/Downloads/data-download-location/cli-29.output.zip ``` 介绍一下几个可用的参数: - `-f` 或 `--from` 指定下载的子路径,不填则下载整个输出 - `-t` 或 `--target` 本地存在位置,不填则使用当前路径 - `-u` 或 `--unarchive` 是否自动解压压缩包并删除源文件,不填则默认保留压缩包,不进行自动解压 :::note 使用 `-u` 或 `--unarchive` 参数,要求 `-t` 或 `--target` 所选择的文件夹为空文件夹 ::: ### 2. 创建「Python 脚本执行」,并等待容器执行完成后下载输出内容 组合使用 `bayes gear run task` 和 `bayes gear download` 命令,将会等待「Python 脚本执行」完成后下载输出内容。 ``` $ bayes gear run task -f && bayes gear download -t /Users/username/test-data-download -u 当前正在组织 org1 上进行操作... command 信息为: sleep 1 正在上传源代码... 正在准备上传源代码... 正在获取上传授权... 开始扫描文件,请稍候... 共发现 10 个文件,总计 4.4 MB,开始上传... 上传进度: 100% (10/10): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.43M/4.43M [00:05<00:00, 809kB/s] ✅ 源代码上传成功! 已上传 10 个文件 正在向服务器请求创建容器... 容器创建成功 打开网页 https://openbayes.com/console/org1/jobs/onl6jcbkgahd 可查看容器的详细信息 容器运行中 当前正在组织 org1 上进行操作... 正在下载中,请稍候 下载完成,文件保存在 /Users/username/test-data-download/test-cli.output.zip 正在解压中,请稍候 解压成功: 文件已解压到 /Users/username/test-data-download 已删除源文件: /Users/username/test-data-download/test-cli.output.zip ``` ## 用命令行工具打开容器 web 界面 通过以下命令我们可以直接从命令行打开 web 界面: ``` $ bayes gear open 6q848lathbdp 当前正在组织 org1 上进行操作... 正在打开任务 https://beta.openbayes.com/console/org1/jobs/6q848lathbdp 正在跳转到浏览器... 已成功打开浏览器. ``` 亦可以通过容器的名称打开 ``` $ bayes gear open practicalAI 当前正在组织 org1 上进行操作... 正在打开容器 https://openbayes.com/console/org1/containers/6q848lathbdp 正在跳转到浏览器... 已成功打开浏览器. ``` 或者,在容器执行命令最后加入 -o 参数,命令行工具将会在上传或合并完成后立即打开相应的 web 界面: ``` $ bayes gear run workspace -o -f 当前正在组织 org1 上进行操作... 正在向服务器请求创建容器... 容器创建成功 打开网页 https://openbayes.com/console/org1/jobs/52yaekv8nf91 可查看容器的详细信息 已成功打开浏览器. 容器运行中 ``` :::note `bayes gear` 的 `run` `restart` `stop` 命令均可在命令的最后加入 `-o` 选项,命令行将会在容器到达目标状态后,在浏览器打开相应的 web 界面 ::: ## 用命令行工具跟踪容器日志及容器状态 ### 1. 日志跟踪 通过命令 `bayes gear logs` 可以查看运行中的容器日志,加入 `-f` 或 `--follow` 参数会持续跟踪容器的日志打印 ``` $ bayes gear logs 1ekrvwi6uyac -f [I 14:41:01.149 LabApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret [W 14:41:01.433 LabApp] All authentication is disabled. Anyone who can connect to this server will be able to run code. [I 14:41:01.749 LabApp] JupyterLab extension loaded from /usr/local/lib/python3.6/site-packages/jupyterlab [I 14:41:01.750 LabApp] JupyterLab application directory is /usr/local/share/jupyter/lab [I 14:41:01.758 LabApp] Serving notebooks from local directory: /openbayes [I 14:41:01.758 LabApp] Jupyter Notebook 6.1.4 is running at: [I 14:41:01.758 LabApp] http://username-1ekrvwi6uyac-main:8888/jobs/username/jobs/1ekrvwi6uyac/ [I 14:41:01.758 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). ... ... ... ``` ### 2. 状态跟踪 `bayes gear` 的子命令 `run` `restart` `stop` 都支持加入 `-f` 或 `--follow` 参数跟踪容器状态。 :::caution 状态跟踪只对「Python 脚本」 及「 Jupyter工作空间」任务生效,对「自动调参」任务无效。 ::: 其中, `run` `restart` 命令: - 对于 「Python 脚本」 任务,会跟踪到整个任务启动完成 - 对于 「Jupyter 工作空间」任务,会跟踪到 Jupyter 工作空间启动完成 - 对于 「 自动调参」任务,`--follow` 参数不生效 `stop` 命令: - 对于 「Python 脚本」 任务,会跟踪任务直到容器完全关闭 - 对于 「Jupyter 工作空间」任务,会跟踪任务直到容器完全关闭 - 对于 「 自动调参」任务,`--follow` 参数不生效 --- ## bayes data create ### 描述 创建一个新的数据集 ```bash bayes data create [数据集名字] [选项] ``` ### 可用选项 ```bash -h, --help 查看 create 的帮助 -m, --message string [可选] 数据集描述信息 -o, --open [可选] 创建数据集成功后,在浏览器打开 ``` ### 使用用例 ```bash bayes data create MNIST bayes data create MNIST -m 经典的手写数字数据库 -o ``` ### 相关命令 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes data ls ### 描述 显示用户的数据集 ```bash bayes data ls [选项] ``` ### 可用选项 ```bash -h, --help 查看 ls 的帮助 -p, --page string [可选] 跳转页码 -u, --user string [可选] 用户名 ``` ### 使用用例 ```bash bayes data ls bayes data ls --user openbayes ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes data new-version ### 描述 创建一个新的空的数据集版本 ```bash bayes data new-version [数据集编号] [选项] ``` ### 可用选项 ```bash -h, --help 查看帮助 ``` ### 使用用例 ```bash bayes data new-version EsWBj9PqtZD ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes data open ### 描述 在浏览器打开数据集页面 ```bash bayes data open [数据集编号] [选项] ``` ### 可用选项 ```bash -h, --help 查看 open 的帮助 ``` ### 使用用例 ```bash bayes data open 5dc7ZhDDUZE ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes data upload ### 描述 上传本地数据到数据集 ```bash bayes data upload [数据集编号] [选项] ``` ### 可用选项 ```bash -v, --version int 需要上传的数据集版本号 -d, --directory string [可选] 数据集文件上传的指定路径,不填则默认使用根目录 -o, --open [可选] 上传数据集成功后,在浏览器打开 -p, --path string [可选] 数据集文件或文件夹的本地路径,不填则使用当前目录 -h, --help 查看 upload 的帮助 ``` ### 使用用例 ```bash bayes data upload EsWBj9PqtZD --version 1 bayes data upload EsWBj9PqtZD --version 1 -d /directory/ bayes data upload EsWBj9PqtZD --version 1 -d /directory/ -p '/home/paths' -o bayes data upload EsWBj9PqtZD -v 1 -d /directory/ -p '/Users/username/test/test.txt' -o bayes data upload EsWBj9PqtZD -v 1 -d /directory/ -p '/Users/username/test' -o ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes data versions ### 描述 显示用户的数据集的版本列表 ```bash bayes data versions [数据集编号] [选项] ``` ### 可用选项 ```bash -h, --help 查看 versions 的帮助 ``` ### 使用用例 ```bash bayes data versions eBIQp4yPMtU ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 --- ## bayes data ### 描述 数据集相关 ### 可用选项 ```bash -h, --help 查看 data 的帮助 ``` ### 使用用例 ```bash # 创建一个新的数据集 bayes data create MNIST bayes data create MNIST -m 经典的手写数字数据库 -o # 创建一个新的空数据集版本 bayes data new-version EsWBj9PqtZD # 上传数据到数据集 bayes data upload EsWBj9PqtZD --version 1 bayes data upload EsWBj9PqtZD --version 1 -d /directory/ bayes data upload EsWBj9PqtZD --version 1 -d /directory/ -p /home/paths -o # 查看所有的数据集 bayes data ls bayes data ls --user openbayes # 查看数据集下的版本 bayes data versions EsWBj9PqtZD # 打开浏览器查看数据集 bayes data open EsWBj9PqtZD ``` ### 相关命令 * [bayes data create](/docs/cli/reference/bayes-data-create/) - 创建一个新的数据集 * [bayes data new-version](/docs/cli/reference/bayes-data-new-version/) - 创建一个新的空的数据集版本 * [bayes data ls](/docs/cli/reference/bayes-data-ls/) - 显示用户的数据集 * [bayes data open](/docs/cli/reference/bayes-data-open/) - 在浏览器打开数据集页面 * [bayes data upload](/docs/cli/reference/bayes-data-upload/) - 上传本地数据到数据集 * [bayes data versions](/docs/cli/reference/bayes-data-versions/) - 显示用户的数据集的版本列表 --- ## bayes gear bindings ### 描述 查看运行容器可绑定的数据 ```bash bayes gear bindings [选项] ``` ### 可用选项 ```bash -h, --help 查看 bindings 的帮助 -q, --query string 输入关键字查询可绑定的数据 ``` ### 使用用例 ```bash bayes gear bindings bayes gear bindings -q test ``` ### 相关命令 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear download ### 描述 下载容器输出 ```bash bayes gear download [任务编码] [选项] ``` ### 可用选项 ```bash -f, --from string [可选] 指定下载的子路径,不填则下载整个输出 -h, --help 查看 download 的帮助 -t, --target string [可选] 本地存在位置,不填则使用当前路径 -u, --unarchive [可选] 是否自动解压压缩包并删除源文件 ``` ### 使用用例 ```bash bayes gear download 3s55ypc33ptl -t /home/paths bayes gear download 3s55ypc33ptl --from subPath --target /home/paths -u # 组合使用 bayes gear run task -f && bayes gear download --target /home/paths -u ``` ### 注意事项 当使用 `-u` 或 `--unarchive` 选项进行自动解压时: - 指定的本地存放位置(通过 `-t` 或 `--target` 指定)必须是一个空文件夹,否则会导致解压失败 - 如果指定的本地文件夹不存在,系统会自动创建该文件夹 - 解压完成后会自动删除原始压缩包文件 ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear env ### 描述 查看运行容器可选的环境 ```bash bayes gear env [选项] ``` ### 可用选项 ```bash -h, --help 查看 env 的帮助 ``` ### 使用用例 ```bash bayes gear env ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear init ### 描述 初始化容器 ```bash bayes gear init [容器名称 或 容器编码] [选项] ``` ### 可用选项 ```bash -h, --help 查看 init 的帮助 -m, --message string [可选] 容器描述 -o, --open [可选] 成功初始化容器后,在浏览器打开 ``` ### 使用用例 ```bash # 创建一个空的容器 bayes gear init Demo -m 容器测试项目 # 初始化一个已有的容器 bayes gear init fkBWU5NMtHl ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear logs ### 描述 查看容器日志 ```bash bayes gear logs [选项] ``` ### 可用选项 ```bash -f, --follow [可选] 日志自动更新 -h, --help 查看 logs 的帮助 ``` ### 使用用例 ```bash bayes gear logs e14m2mm4xvbd bayes gear logs e14m2mm4xvbd -f ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear ls ### 描述 查看所有容器 ```bash bayes gear ls [选项] ``` ### 可用选项 ```bash -h, --help 查看 ls 的帮助 -p, --page string [可选] 跳转页码 ``` ### 使用用例 ```bash bayes gear ls ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear open ### 描述 在浏览器打开容器页面 ```bash bayes gear open [容器名称 或 容器ID 或 任务ID] [选项] ``` ### 可用选项 ```bash -h, --help 查看 open 的帮助 ``` ### 使用用例 ```bash # 使用 容器ID 打开 bayes gear open PVfSbJ4RSlI # 使用 任务ID 打开 bayes gear open 753ad3gqjyso # 使用 容器名称 打开 bayes gear open 训练测试 ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear resource ### 描述 查看运行容器可选的资源 ```bash bayes gear resource [选项] ``` ### 可用选项 ```bash -h, --help 查看 resource 的帮助 ``` ### 使用用例 ```bash bayes gear resource ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear restart ### 描述 继续执行容器 ```bash bayes gear restart [任务编码] [选项] ``` ### 可用选项 ```bash -d, --data strings 绑定数据 -e, --env string 选择镜像 -f, --follow [可选] 继续执行容器的状态跟踪 -h, --help 查看 restart 的帮助 -m, --message string 执行描述 -o, --open [可选] 继续执行容器后,在浏览器打开 -r, --resource string 选择算力 ``` ### 使用用例 ```bash # 使用原有的资源重启执行容器 bayes gear restart 3s55ypc33ptl -o -f # 使用指定的资源重启执行容器 bayes gear restart 3s55ypc33ptl \ --resource cpu \ --env pytorch-2.0 \ --data openbayes/eBIQp4yPMtU/1:/input0 \ --data openbayes/sTggKplxyT6/1:/input1 \ --data openbayes/bbNaMvDNqO9/1:/input2 \ --message "restart message" bayes gear restart 3s55ypc33ptl \ --data openbayes/eBIQp4yPMtU/1:/input0 --message "restart message" -- sleep 60 ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear run ### 描述 运行容器 ```bash bayes gear run [task 或 workspace 或 hypertuning] [选项] ``` ### 可用选项 ```bash -d, --data strings 绑定数据 -e, --env string 选择镜像 -f, --follow [可选] 运行容器的状态跟踪 -h, --help 查看 run 的帮助 -m, --message string 执行描述 -o, --open [可选] 成功创建容器后,在浏览器打开 -r, --resource string 选择算力 ``` ### 使用用例 ```bash # 创建「Python 脚本执行」任务,并在浏览器打开,在终端跟踪状态 bayes gear run task -o -f # 创建一个包含数据绑定的「Python 脚本」任务 bayes gear run task \ --resource cpu \ --env pytorch-2.0 \ --data openbayes/eBIQp4yPMtU/1:/input0 \ --data openbayes/sTggKplxyT6/1:/input1 \ --data openbayes/bbNaMvDNqO9/1:/input2 \ --data aisensiy/jobs/3s55ypc33ptl/output:/output --message "task message" -- sleep 60 # 创建一个复杂命令的「Python 脚本」任务 bayes gear run task \ --resource rtx-4090 \ --env pytorch-2.6-2204 -o -f -- 'echo 123 && python main.py' # 创建 Jupyter 工作空间,并在浏览器打开,在终端跟踪状态 bayes gear run workspace -o -f # 创建一个包含数据绑定的 Jupyter 工作空间 bayes gear run workspace \ --resource cpu \ --env pytorch-2.0 \ --data openbayes/eBIQp4yPMtU/1:/input0 \ --data openbayes/sTggKplxyT6/1:/input1 \ --data openbayes/bbNaMvDNqO9/1:/input2 \ --data aisensiy/jobs/3s55ypc33ptl/output:/output \ --message "workspace message" # 创建一个「自动调参」任务, 并在浏览器打开 bayes gear run hypertuning -o ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear status ### 描述 查看容器下的所有任务 ```bash bayes gear status [选项] ``` ### 可用选项 ```bash -h, --help 查看 status 的帮助 -p, --page string [可选] 跳转页码 ``` ### 使用用例 ```bash bayes gear status # 查看第二页容器下的所有任务 bayes gear status -p 2 ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes gear stop ### 描述 停止容器 ```bash bayes gear stop [任务编码] [选项] bayes gear stop [选项] # 在已初始化的项目目录下使用 ``` ### 参数 ```bash [任务编码] # 可选,未提供时将使用当前目录下.openbayesgear文件中的任务ID ``` ### 可用选项 ```bash -f, --follow [可选] 停止容器的状态跟踪 -h, --help 查看 stop 的帮助 -o, --open [可选] 在浏览器打开正在关闭的容器 ``` ### 使用用例 ```bash # 使用任务编码停止容器 bayes gear stop 3s55ypc33ptl -o -f # 在已初始化的项目目录下停止容器 bayes gear stop -o -f ``` ### 注意事项 如果不提供任务编码,必须在已初始化的项目目录下执行命令。命令将使用当前目录下 `.openbayesgear` 文件中的任务 ID。 ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 --- ## bayes gear ### 描述 容器相关 ### 可用选项 ```bash -h, --help 查看 gear 的帮助 ``` ### 使用用例 ```bash # 初始化当前目录 bayes gear init Demo -m 容器测试项目 bayes gear init fkBWU5NMtHl # 获取日志 (在终端跟踪日志) bayes gear logs e14m2mm4xvbd bayes gear logs e14m2mm4xvbd -f # 查看所有的容器 bayes gear ls # 查看当前容器下的所有执行 bayes gear status # 查看可以绑定的数据 bayes gear bindings # 查看可用的镜像 bayes gear env # 查看可用的算力 bayes gear resource # 创建「Python 脚本执行」-- 后为入口命令 bayes gear run task -- sleep 60 # 创建「Python 脚本执行」 (在浏览器打开,在终端跟踪状态) bayes gear run task -o -f # 下载整个输出或指定子路径到指定文件夹 (下载完成后自动解压) bayes gear download 3s55ypc33ptl -t /home/paths bayes gear download 3s55ypc33ptl --from subPath --target /home/paths -u # 创建「Python 脚本执行」,并在任务完成后下载输出到指定文件夹 (下载完成后自动解压) bayes gear run task -f && bayes gear download --target /home/paths -u # 创建 Jupyter 工作空间 (在浏览器打开,在终端跟踪状态) bayes gear run workspace -o -f # 创建一个「自动调参」任务 (在浏览器打开) bayes gear run hypertuning -o # 重启一个容器 (在浏览器打开,在终端跟踪状态) bayes gear restart 3s55ypc33ptl -o -f # 关闭一个执行 (在浏览器打开,在终端跟踪状态) bayes gear stop 3s55ypc33ptl -o -f # 打开浏览器查看容器 bayes gear open bdNf8tPgza7 bayes gear open GEAR_NAME25 bayes gear open pd3lpzl9g66z ``` ### 相关命令 * [bayes gear bindings](/docs/cli/reference/bayes-gear-bindings/) - 查看运行容器可绑定的数据 * [bayes gear download](/docs/cli/reference/bayes-gear-download/) - 下载容器输出 * [bayes gear env](/docs/cli/reference/bayes-gear-env/) - 查看运行容器可选的环境 * [bayes gear init](/docs/cli/reference/bayes-gear-init/) - 初始化容器 * [bayes gear logs](/docs/cli/reference/bayes-gear-logs/) - 查看容器日志 * [bayes gear ls](/docs/cli/reference/bayes-gear-ls/) - 查看所有容器 * [bayes gear open](/docs/cli/reference/bayes-gear-open/) - 在浏览器打开容器页面 * [bayes gear resource](/docs/cli/reference/bayes-gear-resource/) - 查看运行容器可选的资源 * [bayes gear restart](/docs/cli/reference/bayes-gear-restart/) - 继续执行容器 * [bayes gear run](/docs/cli/reference/bayes-gear-run/) - 运行容器 * [bayes gear status](/docs/cli/reference/bayes-gear-status/) - 查看容器下的所有任务 * [bayes gear stop](/docs/cli/reference/bayes-gear-stop/) - 停止容器 --- ## bayes login ### 描述 登录 ```bash bayes login [用户名|令牌] [选项] ``` ### 可用选项 ```bash -h, --help 查看 login 的帮助 ``` ### 环境变量 | 环境变量 | 说明 | | --- | --- | | `OPENBAYES_TOKEN` | API 令牌,设置后 CLI 自动完成认证 | | `OPENBAYES_USER` | 用户名,配合 `OPENBAYES_ORG` 自动切换组织 | | `OPENBAYES_ORG` | 组织名,配合 `OPENBAYES_USER` 自动切换组织 | ### 使用用例 通过令牌登录(推荐): ```bash # 通过命令行参数 bayes login # 或通过环境变量 export OPENBAYES_TOKEN= ``` 通过用户名和密码登录: ```bash bayes login [用户名] ``` ### 其他命令 * [bayes data](/docs/cli/reference/bayes-data/) - 数据集相关 * [bayes gear](/docs/cli/reference/bayes-gear/) - 容器相关 * [bayes logout](/docs/cli/reference/bayes-logout/) - 注销 * [bayes org](/docs/cli/reference/bayes-org/) - 组织相关 * [bayes ssh](/docs/cli/reference/bayes-ssh/) - SSH 相关 * [bayes status](/docs/cli/reference/bayes-status/) - 登录信息 * [bayes switch](/docs/cli/reference/bayes-switch/) - 切换服务端环境 --- ## bayes logout ### 描述 注销 ```bash bayes logout [选项] ``` ### 可用选项 ```bash -h, --help 查看 logout 的帮助 ``` ### 使用用例 ```bash bayes logout ``` ### 其他命令 * [bayes data](/docs/cli/reference/bayes-data/) - 数据集相关 * [bayes gear](/docs/cli/reference/bayes-gear/) - 容器相关 * [bayes login](/docs/cli/reference/bayes-login/) - 登录 * [bayes org](/docs/cli/reference/bayes-org/) - 组织相关 * [bayes ssh](/docs/cli/reference/bayes-ssh/) - SSH 相关 * [bayes status](/docs/cli/reference/bayes-status/) - 登录信息 * [bayes switch](/docs/cli/reference/bayes-switch/) - 切换服务端环境 --- ## bayes org ls ### 描述 查看所属组织 ```bash bayes org ls [选项] ``` ### 可用选项 ```bash -h, --help 查看 ls 的帮助 ``` ### 使用用例 ```bash bayes org ls ``` ### 相关命令 * [bayes org status](/docs/cli/reference/bayes-org-status/) - 组织信息 * [bayes org switch](/docs/cli/reference/bayes-org-switch/) - 组织切换 --- ## bayes org status ### 描述 组织信息 ```bash bayes org status [选项] ``` ### 可用选项 ```bash -h, --help 查看 status 的帮助 ``` ### 使用用例 ```bash bayes org status ``` ### 相关命令 * [bayes org ls](/docs/cli/reference/bayes-org-ls/) - 查看所属组织 * [bayes org switch](/docs/cli/reference/bayes-org-switch/) - 组织切换 --- ## bayes org switch ### 描述 组织切换 ```bash bayes org switch [组织名] [选项] ``` ### 可用选项 ```bash -h, --help 查看 switch 的帮助 ``` ### 使用用例 ```bash # 切换到 "openbayes-org" 组织 bayes org switch openbayes-org # 切换回个人账号 bayes org switch aisensiy ``` ### 相关命令 * [bayes org ls](/docs/cli/reference/bayes-org-ls/) - 查看所属组织 * [bayes org status](/docs/cli/reference/bayes-org-status/) - 组织信息 --- ## bayes org ### 描述 组织相关 ### 可用选项 ```bash -h, --help 查看 org 的帮助 ``` ### 使用用例 ```bash # 切换到 "openbayes-org" 组织 bayes org switch openbayes-org # 切换回个人账号 bayes org switch aisensiy # 查看当前组织 bayes org status # 查看所属组织 bayes org ls ``` ### 相关命令 * [bayes org ls](/docs/cli/reference/bayes-org-ls/) - 查看所属组织 * [bayes org status](/docs/cli/reference/bayes-org-status/) - 组织信息 * [bayes org switch](/docs/cli/reference/bayes-org-switch/) - 组织切换 --- ## bayes ssh create ### 描述 创建新的 SSH key ```bash bayes ssh create [选项] ``` ### 可用选项 ```bash -h, --help 查看 create 的帮助 ``` ### 使用用例 ```bash bayes ssh create ``` ### 相关命令 * [bayes ssh upload](/docs/cli/reference/bayes-ssh-upload/) - 上传 SSH 公钥 --- ## bayes ssh upload ### 描述 上传 SSH 公钥 ```bash bayes ssh upload [公钥] [选项] ``` ### 可用选项 ```bash -h, --help 查看 upload 的帮助 -n, --name string [可选] SSH 名字,不填则默认使用 hostname ``` ### 使用用例 ```bash bayes ssh upload ~/.ssh/id_rsa.pub --name hostname ``` ### 相关命令 * [bayes ssh create](/docs/cli/reference/bayes-ssh-create/) - 创建新的 SSH key --- ## bayes ssh ### 描述 SSH 相关 ### 可用选项 ```bash -h, --help 查看 ssh 的帮助 ``` ### 使用用例 ```bash # 创建 SSH key,并上传 SSH 公钥 bayes ssh create # 上传 SSH 公钥 bayes ssh upload ~/.ssh/id_rsa.pub --name hostname ``` ### 相关命令 * [bayes ssh create](/docs/cli/reference/bayes-ssh-create/) - 创建新的 SSH key * [bayes ssh upload](/docs/cli/reference/bayes-ssh-upload/) - 上传 SSH 公钥 --- ## bayes status ### 描述 登录信息 ```bash bayes status [选项] ``` ### 可用选项 ```bash -h, --help 查看 status 的帮助 ``` ### 使用用例 ```bash bayes status ``` ### 其他命令 * [bayes data](/docs/cli/reference/bayes-data/) - 数据集相关 * [bayes gear](/docs/cli/reference/bayes-gear/) - 容器相关 * [bayes login](/docs/cli/reference/bayes-login/) - 登录 * [bayes logout](/docs/cli/reference/bayes-logout/) - 注销 * [bayes org](/docs/cli/reference/bayes-org/) - 组织相关 * [bayes ssh](/docs/cli/reference/bayes-ssh/) - SSH 相关 * [bayes switch](/docs/cli/reference/bayes-switch/) - 切换服务端环境 --- ## bayes switch ### 描述 切换服务端环境 ```bash bayes switch [配置名] [选项] ``` ### 可用选项 ```bash -e, --endpoint string [可选] 填入 endpoint -h, --help 查看 switch 的帮助 ``` ### 使用用例 ```bash bayes switch openbayes # 切换到自定义的服务端 bayes switch custom -e http://custom.com ``` ### 其他命令 * [bayes data](/docs/cli/reference/bayes-data/) - 数据集相关 * [bayes gear](/docs/cli/reference/bayes-gear/) - 容器相关 * [bayes login](/docs/cli/reference/bayes-login/) - 登录 * [bayes logout](/docs/cli/reference/bayes-logout/) - 注销 * [bayes org](/docs/cli/reference/bayes-org/) - 组织相关 * [bayes ssh](/docs/cli/reference/bayes-ssh/) - SSH 相关 * [bayes status](/docs/cli/reference/bayes-status/) - 登录信息 --- ## bayes OpenBayes 的 CLI 命令行工具,可以方便的让您在无需访问网页控制台的情况下访问您的算力容器、数据集等资源,并执行新建、删除、执行、上传数据等常见操作。 | 命令 | 描述 | | ------------------ | ------------------------ | | `bayes data` | 数据集相关 | | `bayes data create` | 创建一个新的数据集 | | `bayes data ls` | 显示用户的数据集 | | `bayes data new-version` | 创建一个新的空的数据集版本 | | `bayes data open` | 在浏览器打开数据集页面 | | `bayes data upload` | 上传本地数据到数据集 | | `bayes data versions` | 显示用户的数据集的版本列表 | | `bayes gear` | 容器相关 | | `bayes gear bindings` | 查看运行容器可绑定的数据 | | `bayes gear download` | 下载容器输出 | | `bayes gear env` | 查看运行容器可选的环境 | | `bayes gear init` | 初始化容器 | | `bayes gear logs` | 查看容器日志 | | `bayes gear ls` | 查看所有容器 | | `bayes gear open` | 在浏览器打开容器页面 | | `bayes gear resource` | 查看运行容器可选的资源 | | `bayes gear restart` | 继续执行容器 | | `bayes gear run` | 运行容器 | | `bayes gear status` | 查看容器下的所有任务 | | `bayes gear stop` | 停止容器 | | `bayes login` | 登录 | | `bayes logout` | 注销 | | `bayes org` | 组织相关 | | `bayes org ls` | 查看所属组织 | | `bayes org status` | 组织信息 | | `bayes org switch` | 组织切换 | | `bayes ssh` | SSH 相关 | | `bayes ssh create` | 创建新的 SSH key | | `bayes ssh upload` | 上传 SSH 公钥 | | `bayes status` | 登录信息 | | `bayes switch` | 切换服务端环境 | --- ## bayes 命令索引介绍 命令行工具的所有命令通过增加 `-h` 参数可以获取对应命令的帮助信息。例如 ``` $ bayes data upload -h 上传本地数据到数据集 用法: bayes data upload [数据集编号] [选项] 可用选项: -p, --path string [可选] 数据集文件的本地路径,不填则使用当前目录 -o, --open [可选] 上传数据集成功后,在浏览器打开 -h, --help 查看 upload 的帮助 -v, --v 查看详细的错误信息 使用用例: bayes data upload EsWBj9PqtZD bayes data upload EsWBj9PqtZD -p /home/paths -o ``` 可以看到有详细的命令描述、用法、参数以及例子。为了方便文档的查找,我们也将每个命令对应的帮助文档提供在这里。 --- ## 用 bayes 上传数据 这里我们介绍如何使用 `bayes` 上传数据集的完整流程: 1. 创建一个新的数据集 2. 创建一个空的数据集版本 3. 上传数据到指定版本 4. 查看和管理数据集 下面我们将使用 tiny imagenet 数据集作为示例,逐步说明整个过程。 ## 创建一个新的数据集 ``` $ bayes data create tiny-imagenet -m "稍微说明一下这个 tiny-imagenet 数据集" -o 数据集 tiny-imagenet (tiQXU5Z5DIy) 创建成功 打开网页 https://openbayes.com/console/username/datasets/tiQXU5Z5DIy 可查看数据集 tiny-imagenet (tiQXU5Z5DIy) 的详细信息 正在跳转到浏览器... 已成功打开浏览器 ``` 介绍一下几个可用的参数: - `-m` 或 `--message` 数据集描述信息,可留空 - `-o` 或 `--open` 将会在数据集创建成功后,在浏览器打开相应的 web 界面 同时你也可以在终端的打印信息中看到在数据集的 URL 和 ID。 ## 创建一个空的数据集版本 在上传数据之前,需要先创建一个空的数据集版本。使用以下命令创建一个空的数据集版本: ``` $ bayes data new-version tiQXU5Z5DIy 当前正在个人账号 admin 上进行操作... 数据集 tiQXU5Z5DIy/1 创建成功 ``` 创建成功后,系统会返回新创建的版本号,这个版本号将在后续上传数据时使用。请记住这个版本号,因为在上传数据时需要通过 `--version` 或者 `-v` 参数指定。如果忘记了版本号,可以通过 `bayes data versions tiQXU5Z5DIy` 命令查看所有版本。 ## 通过命令行直接上传文件夹 创建空的数据集版本后,你可以将数据上传到该版本。在上传命令中,需要指定 `--version` 或者 `-v` 参数为前一步创建的版本号: ``` $ bayes data upload tiQXU5Z5DIy -v 1 -p '/Users/username/test-upload' -o 当前正在个人账号 admin 上进行操作... 当前工作目录 /Users/username/test-upload 正在准备上传数据集 tiQXU5Z5DIy... 正在获取上传授权... 开始上传文件,请耐心等待... 共发现 3 个文件 正在分析文件列表... 剔除在 .openbayesignore 中忽略的文件及文件夹... 共有文件 2 个需要上传,忽略了 2 个文件 被忽略的文件列表: - .DS_Store - .openbayesignore 78949397fb964f6293f9c71b0488e2d9.jpeg: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 117k/117k [00:00<00:00, 122kB/s] ↑ 已上传: /Users/username/test-upload/78949397fb964f6293f9c71b0488e2d9.jpeg 开始新的分块上传: 测试视频.mov 创建新的上传ID: f436061f-305d-43c3-b32d-5d9557ada5cb 测试视频.mov: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 37.3M/37.3M [00:11<00:00, 3.18MB/s] ↑ 已上传: /Users/username/test-upload/测试视频.mov ✅ 上传成功! 已上传 2 个文件,跳过 0 个已存在文件 数据集 tiQXU5Z5DIy 的版本 v1 已更新 正在打开数据集 https://openbayes.com/console/admin/datasets/tiQXU5Z5DIy 正在跳转到浏览器... 已成功打开浏览器. ``` 命令行上传支持断点续传,如果在上传过程中因为意外请求中断了,再次输入上传命令可以自动恢复未完成的上传任务: ``` $ bayes data upload tiQXU5Z5DIy -v 1 -p '/Users/username/test-upload' -o 当前正在个人账号 admin 上进行操作... 当前工作目录 /Users/username/test-upload 正在准备上传数据集 tiQXU5Z5DIy... 正在获取上传授权... 开始上传文件,请耐心等待... 共发现 4 个文件 正在分析文件列表... 剔除在 .openbayesignore 中忽略的文件及文件夹... 共有文件 2 个需要上传,忽略了 2 个文件 被忽略的文件列表: - .DS_Store - .openbayesignore ↷ 跳过: /Users/username/test-upload/78949397fb964f6293f9c71b0488e2d9.jpeg (已存在) 找到未完成的上传任务,正在恢复: 测试视频.mov 恢复上传ID: 8a005a27-5639-45ff-af1b-ec9444d62c63 已上传 2 个分块,共 8 个分块 测试视频.mov: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 37.3M/37.3M [00:05<00:00, 4.60MB/s] ↑ 已上传: /Users/username/test-upload/测试视频.mov ✅ 上传成功! 已上传 1 个文件,跳过 1 个已存在文件 数据集 tiQXU5Z5DIy 的版本 v1 已更新 正在打开数据集 https://openbayes.com/console/admin/datasets/tiQXU5Z5DIy 正在跳转到浏览器... 已成功打开浏览器. ``` 介绍一下几个可用的参数: - `-v` 或 `--version` 需要上传的数据集版本号,必填 - `-p` 或 `--path` 数据集文件或文件夹的本地路径,不填则使用当前目录 - `-d` 或 `--directory` 数据集文件上传的指定路径,不填则默认使用根目录 - `-o` 或 `--open` 将会在数据集上传完成后,在浏览器打开相应的 web 界面 稍等服务器端数据同步可以看到数据集已经上传好了: ![](/img/docs/bayes-upload-dataset-1.png) :::note 如果你已经有一个现成的压缩包需要上传到 OpenBayes,你可以通过命令 `bayes data upload tiQXU5Z5DIy -v 1 -p '/Users/username/test/测试.zip'` 直接上传。 ::: :::note 如果你只有一个单一文件需要上传到 OpenBayes,你同样可以通过命令 `bayes data upload tiQXU5Z5DIy -v 1 -p '/Users/username/test/test.txt'` 上传到 OpenBayes。 ::: ## 通过命令行打开数据集 web 界面 通过以下命令我们可以直接从命令行打开 web 界面: ``` $ bayes data open tiQXU5Z5DIy 当前正在个人账号 admin 上进行操作... 正在打开数据集 https://openbayes.com/console/username/datasets/tiQXU5Z5DIy 正在跳转到浏览器... 已成功打开浏览器. ``` 或者,在上传命令最后加入 -o 参数,命令行工具将会在上传完成后立即打开相应的 web 界面: ``` $ bayes data upload tiQXU5Z5DIy -v 1 -p '/Users/username/test-upload' -o 当前正在个人账号 admin 上进行操作... 当前工作目录 /Users/username/test-upload 正在准备上传数据集 tiQXU5Z5DIy... 正在获取上传授权... 开始上传文件,请耐心等待... 共发现 3 个文件 正在分析文件列表... 剔除在 .openbayesignore 中忽略的文件及文件夹... 共有文件 2 个需要上传,忽略了 2 个文件 被忽略的文件列表: - .DS_Store - .openbayesignore 78949397fb964f6293f9c71b0488e2d9.jpeg: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 117k/117k [00:00<00:00, 122kB/s] ↑ 已上传: /Users/username/test-upload/78949397fb964f6293f9c71b0488e2d9.jpeg 开始新的分块上传: 测试视频.mov 创建新的上传ID: f436061f-305d-43c3-b32d-5d9557ada5cb 测试视频.mov: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 37.3M/37.3M [00:11<00:00, 3.18MB/s] ↑ 已上传: /Users/username/test-upload/测试视频.mov ✅ 上传成功! 已上传 2 个文件,跳过 0 个已存在文件 数据集 tiQXU5Z5DIy 的版本 v1 已更新 正在打开数据集 https://openbayes.com/console/admin/datasets/tiQXU5Z5DIy 正在跳转到浏览器... 已成功打开浏览器. ``` --- ## 数据上传 目前 OpenBayes 有以下多种方式进行数据上传: 1. 在已经运行起来的「Jupyter 工作空间」进行数据上传 2. 使用 OpenBayes「数据仓库」中的「上传」功能 3. 使用 FileBrowser 进行数据上传 其中「数据仓库」的上传支持通过浏览器上传和 bayes 命令行工具上传。对于数据规模不大的情况,通过「Jupyter 工作空间」上传是可以满足需求的。但是如果希望更多的数据管理(增删改查,批量目录上传,断点续传等)可以使用 FileBrowser 进行数据上传。 ## 通过「Jupyter 工作空间」进行数据上传 在启动「Jupyter 工作空间」后,在左侧的「文件浏览器」可以通过上次的「上传」实现单个文件的上传。 ![](/img/docs/2021-04-07-17-31-37.png) 在大文件(大于 15MB)的上传过程中在其下方会显示一个进度条: ![](/img/docs/data-warehouse-upload-1.png) 通过将文件拖拽到左侧「文件浏览器」也会触发文件的上传。 :::caution 注意 通过「Jupyter 工作空间」上传文件没有「断点续传」的功能,任何上传的失败都需要整个文件重新上传。 ::: ## OpenBayes「数据仓库」中的「上传」功能 :::note 「数据集」上传的功能与「模型」的「上传」功能是一致的,这里以「数据集」为例进行介绍。 ::: 点击左侧菜单栏「数据集」后的「+」,输入数据集名称和描述,即可创建一个空数据集。 ![](/img/docs/data-warehouse-upload-2.png) 数据集创建后可以在数据集页面右上角点击「上传新版本」。 ![](/img/docs/data-warehouse-upload-3.png) 这里的大小限制依据当前用户的剩余空间大小而定,最大支持「500 GB」的文件上传。 ### 多文件上传 在上传界面可以一次性上传最多 500 个文件,支持文件的多选,文件拖拽等多种方式选择要上传的文件。 ![](/img/docs/2021-04-07-18-05-25.png) :::caution 注意 上传的文件无法处理文件的重名,因此在拖拽文件夹上传时,如果上传的文件有相同的名字那么最终只有一个文件会被保存。 ::: ### 断点续传 数据集上传支持「断点续传」,当因为网络或者意外导致一次上传中断后,如果**上传的文件没有更改并且上传的目标数据集没有变化**,数据会继续上一次的上传。 ![](/img/docs/data-warehouse-upload-4.gif) :::caution 注意 断点续传支持的最长周期为 15 天,如果上传的数据集在第一次上传开始后 15 天内依然没有完成上传,其数据将会被删除。 ::: ### 通过 `bayes` 命令行工具上传 在 [用 bayes 上传数据](/docs/cli/upload-dataset/) 已经做了详细的介绍。 ## 使用 FileBrowser 进行数据上传 [FileBrowser](https://filebrowser.org/) 是一个基于 Web 的文件管理器,可以通过浏览器访问 OpenBayes 中的数据集,进行数据的增删改查,批量目录上传等操作。 这里提供一个视频教程,介绍如何使用 FileBrowser 进行数据上传。 --- ## 数据集的版本 ## 创建新的版本 数据集每次创建成功后将会以递增的方式添加一个版本,可以在页面上「版本」的 Tab 中查看所有上传数据的版本。 ![](/img/docs/data-dataset-versions-1.png) 如果在上传后发现数据集版本一直处于「处理中」的状态则可能是因为数据集的解压出现了问题,这个时候可以尝试重新上传数据,数据集会为新的上传递增一个版本。上传失败的数据集可以直接删除。 ![](/img/docs/15535989647229.jpg) ## 更新数据集版本的数据 :::caution 注意 目前「数据集」尚不支持对特定版本中的文件进行删除(删除某个文件),只能通过上传新的版本来删除不需要的文件。 ::: 目前数据集版本支持增量的更新数据,如下图所示点击「上传至当前目录」可以对**当前数据集**的**当前目录**进行更新,同样支持多种压缩包的自动解压。 如果当前目录下存在相同文件名的文件,新上传的文件将覆盖旧文件的内容。 ![](/img/docs/data-dataset-versions-3.png) 数据的上传以及数据的同步依据所上传的数据大小需要一定的处理时间,在处理过程中当前数据集被标记为「处理中」该状态的数据集无法被绑定到容器中。 ## 切换数据集版本 打开数据集页面后默认展示最新版本的数据内容。在「版本」选项卡点击版本号即可将数据集版本切换至所选择版本,点击「概览」即可看到数据集的文件列表更新为当前版本内容。 ![](/img/docs/data-dataset-versions-4.gif) 在右上角的版本选项卡也可以选择版本并切换。 ![](/img/docs/data-dataset-versions-5.png) ## 预览数据集版本下的文件 数据集基本信息下展示了**当前选择版本**的文件列表。默认展示根目录的文件内容。 ![](/img/docs/data-dataset-versions-6.png) 列表中的目录可以展开浏览子目录中的文件,部分格式(如 .txt .csv .py .md .yaml .yml .png .jpeg .jpg .ipynb)文件支持预览。 ![](/img/docs/data-dataset-versions-7.png) :::info 目录预览最多展示 200 个文件(或文件夹),更多的数据请在「绑定数据集」到容器中后查看。 ::: ![](/img/docs/15582578241141.jpg) ## 数据的下载 「预览文件」时可以对单个文件进行下载,点击右侧的下载图标即可。也可以将整个数据集版本以 zip 压缩包的形式下载,点击「下载当前目录」即可。 ![](/img/docs/data-dataset-versions-8.png) :::caution 注意 对于规模非常庞大的数据集下载时间可能长达数个小时甚至数天,任何网络的波动都会导致数据集下载的失败,不建议进行下载。如果有必要下载,建议也只选择必要的文件下载。 ::: --- ## 数据集管理 ## 数据集的创建和数据的上传 见 [数据上传](/docs/data-warehouse/data-upload/)。 ## 绑定数据集到容器 在创建容器时,绑定数据可以选择所创建的数据集将其绑定到容器中指定的目录。 ![](/img/docs/data-warehouse-datasets-1.png) 在绑定数据时,需要选定映射到容器中的目录,如下图所示,将 `cifar_10` 的数据绑定到了 `/input0` 意味着在容器中通过 `/input0` 目录就可访问数据集中的内容。 ![](/img/docs/data-warehouse-datasets-2.png) 例如 `cifar10` 数据集中有文件 `meta.csv`,如果将其绑定在了容器的 `/input0` 目录,那么可以通过路径 `/input0/meta.csv` 读取该文件。 ![](/img/docs/data-warehouse-datasets-3.png) 在容器详情也可以看到具体容器的绑定目录,如下图所示: ![](/img/docs/data-warehouse-datasets-4.png) ## 类型的更改 在「数据集」的设置页面下,允许更改数据集的类型: ![](/img/docs/data-warehouse-datasets-5.png) 将其更改为「模型」后,其将在「模型」类型的数据仓库中展示。 ## 数据版本的删除与整个数据集的删除 上文提到,数据集下可以包含多个版本,如果不再需要某一个特定的版本,可以在「版本」列表右侧的「删除当前版本」按钮处进行删除。该版本被删除后,其所占用的存储资源将会被释放。 ![](/img/docs/data-warehouse-datasets-6.png) 当然整个数据集如果不再需要后也可以被永久删除,删除后该数据集下的各个版本都将被删除,也将不再占用用户的存储配额。 ![](/img/docs/data-warehouse-datasets-7.png) --- ## 数据仓库 FAQ(常见问题解答) ## 如何修改数据集中的内容? 目前数据集不支持对特定版本中的文件进行删除(删除某个文件),但支持部分修改行为。具体的支持情况为: - 在当前版本中,通过「上传数据到当前目录」功能,添加新文件到当前版本 - 在当前版本中,通过「上传数据到当前目录」功能,上传同名的新文件覆盖已有的文件内容 如果您想在工作空间中修改数据集,请将修改后的内容保存至容器的工作目录,然后在容器关闭并同步后,您可以将指定的目录复制到数据集。 ## 上传立即成功但没有在页面看到新的文件 在某些情况下 OpenBayes 会认为某些文件已经存在了(即使文件并没有被成功的上传),这会导致点击上传后,上传对话框立即关闭并提示文件已经上传成功。 这种情况可以再次点击刚刚使用的「上传新版本」或者「上传至当前目录」,点击右上角的「清理上传缓存」后再次尝试上传流程。 ![](/img/docs/2021-04-09-18-11-39.png) ## 自动解压的顶级目录丢失了 我们在对一个文件夹做压缩的时候可以有以下两种方式: 直接将文件加压缩: ![](/img/docs/2021-04-07-18-23-01.png) 在文件夹下将文件全选后打包: ![](/img/docs/2021-04-07-18-23-57.png) 对于第一种方式压缩包中实际上会多一层目录,在解压后也会出现一个顶级目录。对于第二种方式,压缩包中是平铺了一系列的文件,解压后不会包含一个额外的目录。 大部分的开发者会使用第一种方式进行文件夹的压缩,但并没有意识到这样解压的文件会多一层目录。为了方便大多数的场景,**当压缩包名称和其顶级目录名称一致时,我们会自动帮助删除这层目录**。举个例子: 我将一个目录 `train` 做了压缩,默认生成一个名为 `train.zip` 的文件。上传后,OpenBayes 会自动将顶级目录 `train` 删除保留其下的文件。 如果希望保留 `train` 这层目录,可以在上传时将 `train.zip` 重命名为 `train_.zip` 这样的名字,上传后 OpenBayes 发现文件名(`train_`)和顶级目录 `train` 不相同,会保留这层目录。 ## 自动解压后显示失败 ![](/img/docs/2021-04-08-15-51-41.png) 在压缩包上传后如果显示「上传失败,请确认数据包格式」则说明 OpenBayes 完全无法解压该压缩包,建议以其他格式打包后上传。 ## 自动解压后实际文件个数变少了 压缩包打包时有多种原因会导致解压的全部或者部分失败: 1. 字符编码格式不兼容,比如 Windows 下默认的中文文件字符编码问题 2. 压缩包由于反复传输导致的部分文件的损坏 3. 压缩包采用了不兼容的格式,见 [macOS 大尺寸 zip 包上传](#macos-下大尺寸-zip-包的上传) OpenBayes 会尝试多种解压工具对压缩进行解压,尽量保证压缩包的完整。但在多种尝试过后依然有可能丢失部分已经损毁的数据。因此如果发现解压后的结果和实际本地解压的结果不符,可以尝试将已经解压的本地数据重新打包或者通过部分打包多次上传的形式传输。 ## macOS 下大尺寸 zip 包的上传 `zip` 最初的标准最多支持大小为 **4GB** 的压缩包,以及最多包含 **65535** 个文件。 而新的 `zip64` 标准对其进行了扩展,支持了更大的压缩包和更多的文件个数。然而 macOS Sierra 以及其之后的版本默认的压缩工具在压缩超过 **4GB** 的内容时并没有支持这个标准,这会导致在 macOS 上压缩的超过 4GB 的压缩包无法在 OpenBayes 被成功解压并上传。 因此请 macOS 的用户使用 [Keka](https://www.keka.io/en/) 或者其他支持 `zip64` 标准的压缩工具。 ![](/img/docs/2021-04-08-15-42-04.png) --- ## 数据仓库介绍 ![](/img/docs/2020-08-27-16-05-12.png) :::note 之前「数据仓库」被称作「数据集」,这更容易被理解为机器学习场景下的标注数据,而实际上这里除了放置标注数据外也可以放置其他任意类型的数据,包括代码、训练的模型文件等。为了避免这个歧义,也是为新的「模型部署」功能做准备,OpenBayes 对原有的「数据集」概念做了调整,将「数据集」改称作「数据仓库」 ::: 目前数据仓库下共有两个分类: - 数据集:除了模型相关的内容外的其他数据都可以放在这里 - 模型:用于存放模型文件、与模型文件配合使用的代码等 ## 数据仓库的创建 两个类型的数据仓库的创建有两个独立的入口。 ### 创建数据集 ![](/img/docs/data-warehouse-index-1.png) ### 创建模型 ![](/img/docs/data-warehouse-index-2.png) :::caution 注意 同样作为数据仓库,「模型」下和「数据集」下不能出现相同名字的项目。 ::: ## 数据仓库类型的切换 在「设置」页面,允许对数据仓库的类型进行切换: ![](/img/docs/data-warehouse-index-3.png) ## 数据仓库之间的拷贝 为了方便用户数据集的管理,除了允许[将工作目录创建为数据仓库版本](/docs/gear/output/#将工作目录创建为数据仓库版本)外,也允许将某一个数据仓库的子目录重新创建为一个数据仓库版本: ![](/img/docs/data-warehouse-index-4.png) 如上图所示,在一个数据仓库版本的某一个目录下点击`「拷贝当前目录到数据集」`即可选择指定的数据集,选择`「添加至已有数据集」`或`「新建数据集」`。 * `「添加至已有数据集」`会把当前数据仓库的子目录添加到选定的已有数据集中。 * `「新建数据集」`会把当前数据目录在目标数据集下创建一个新的数据集版本。 在拷贝或创建过程中新的数据集版本会标记为`「正在拷贝数据」`状态,完成拷贝后数据集版本会标记为`「处理完毕」`,即可使用。 ## 为数据仓库添加 README.md 文件 每个模型仓库版本下可以提供一个名为 `README.md` 的文件,提供对该模型仓库版本的一些说明。该文件会被展示在模型仓库版本的页面中。 ![](/img/docs/data-warehouse-version-view-with-readme.png) ## 公开数据仓库 ![](/img/docs/data-warehouse-index-5.png) 创建的数据仓库默认为「私有数据仓库」,在数据仓库的「设置」页面可以将整个数据仓库设置为「公开数据仓库」。所有的注册用户都可以通过 URL 访问该数据仓库。 ![](/img/docs/view-public-dataset.png) :::note 每个人可以创建的「公开数据仓库」的个数是有限的,其限制可以在「资源使用状况」-「配额限制」-「公有数据集」查看。更多说明见 [配额限制](/docs/limitations)。 ::: --- ## 模型的版本 ## 创建新的版本 模型仓库每次创建成功后将会以递增的方式添加一个版本,可以在页面上「版本」的 Tab 中查看所有上传的版本。 ![](/img/docs/data-model-versions-1.png) ## 更新数据集版本的数据 :::caution 注意 目前「模型」尚不支持对特定版本中的文件进行删除(删除某个文件),只能通过上传新的版本来删除不需要的文件。 ::: 目前模型版本支持增量的更新数据,如下图所示点击「上传至当前目录」可以对**当前模型**的**当前目录**进行更新。 ![](/img/docs/data-model-versions-2.png) 如果当前目录下存在相同文件名的文件,新上传的文件将覆盖旧文件的内容。 数据的上传以及数据的同步依据所上传的数据大小需要一定的处理时间,在处理过程中当前模型版本被标记为「处理中」该状态的模型版本无法被绑定到容器中。 ## 切换模型版本 打开模型页面后默认展示最新版本的内容。在右上角的「版本」选项卡中点击版本号即可将模型版本切换至所选择版本,点击「概览」即可看到模型的文件列表更新为当前版本内容。 ![](/img/docs/data-model-versions-3.png) ## 数据的下载 点击右侧的下载图标可以对单个文件进行下载。也可以将整个版本以 zip 压缩包的形式下载,点击「下载当前目录」即可。 ![](/img/docs/data-model-versions-4.png) --- ## 模型管理 模型与数据集的使用非常类似,主要用于存放模型文件、与模型文件配合使用的代码等。这里注重介绍一些与数据集不同的内容。 ## 模型的创建和上传 在左侧导航栏点击「新建模型」后的「+」,输入模型名称和描述,即可创建一个新的模型仓库。 ![](/img/docs/data-warehouse-models-1.png) 模型创建后可以在模型页面点击 "上传数据"。数据上传后,OpenBayes 会将支持的压缩包自动解压并同步其中数据,这个过程所需时间因数据包大小不同而不同。 模型的上传与数据集一致,文档见 [数据上传](/docs/data-warehouse/data-upload/)。 ## 类型的更改 在「模型」的设置页面下,允许更改数据集的类型: ![](/img/docs/data-warehouse-models-2.png) 将其更改为「数据集」后,其将在「数据集」类型的数据仓库中展示。 ## 模型版本的删除与整个模型仓库的删除 同数据集,见[数据集#数据版本的删除与整个数据集的删除](/docs/data-warehouse/datasets/#数据版本的删除与整个数据集的删除)。 --- ## 用 Conda 进行依赖管理 :::caution 本文适用于内置 Conda 的运行时(基于 Ubuntu 22.04 及更早,如 `pytorch 2.10` 及之前、`vllm 0.19` 及之前)。较新的 Ubuntu 24.04 运行时(如 `vllm 0.20` 及之后、`pytorch 2.11` 及之后)不再内置 Conda,创建独立环境请参考 [用 uv 管理 Python 环境](/docs/gear/uv)。 不确定当前运行时属于哪一种时,在终端执行 `conda --version`:能输出版本号即可使用本文;提示 `command not found` 则请使用 uv。 ::: :::info 这里介绍的用 Conda 依赖管理是完完全全创建一个独立的环境,通常意味着你需要一个与系统自带的 Python 不同版本的环境。如果没有这个需求也就不用创建一个独立的环境了。通过 `pip install --user` 的方式完全可以做到,可以参考文档 [在默认的-python-版本下安装额外的依赖](/docs/runtimes#2-在默认的-python-版本下安装额外的依赖)。 ::: OpenBayes 中的 Python 是通过 Conda 进行管理的,默认的安装环境路径可以通过以下命令获取: ```bash $ conda env list # conda environments: # base * /usr/local ``` 可以看到默认的环境在 `/usr/local` 中,每个环境中的依赖可以通过 `conda list` 获取,在文档左侧「运行时环境」下也提供了完整的安装依赖列表。 ## 使用 Conda 创建新的环境 ### 1. 在 `/openbayes/home` 下创建一个新的环境 ```bash conda create -p open-mmlab python=3.9 -y ``` 安装完成后通过 `conda activate /openbayes/home/open-mmlab` 激活新的环境。 :::note 能够保存环境的关键在于将新的环境的保存路径存放在 /openbayes/home 下,通过「继续执行」可以将这部分内容再次绑定到一个新的执行之中。 ::: ### 2. 按照[文档](https://github.com/open-mmlab/mmdetection/blob/master/docs/get_started.md)安装其他依赖 ```bash conda install pytorch torchvision -c pytorch git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection # 按照官方文档继续安装 pip install mmcv pip install -r requirements/build.txt pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI" pip install -v -e . # or "python setup.py develop" ``` 完成安装后,mmdetection 相关的依赖被安装到了 `/openbayes/home/open-mmlab`(也就是 `/output/open-mmlab` 下。 ![](/img/docs/2020-04-28-17-35-02.png) ### 3. 通过继续执行打开原有的执行 通过「继续执行」的方式将上一次准备的 mmdetection 的环境绑定到新的执行里运行,通过命令 `conda activate /openbayes/home/open-mmlab/` 可以再次激活上一次配置好的环境继续使用了。 ## 将新创建的 Conda 与 Jupyter 工作空间集成 Jupyter 工作空间可以与 Conda 集成以允许同一个 notebook 指定不同的 Conda 环境。按照以下步骤可以将一个自定义的 Conda 环境添加到 Jupyter 工作空间中。 ```bash conda activate /openbayes/home/open-mmlab/ (/openbayes/home/open-mmlab/)$ conda install ipykernel (/openbayes/home/open-mmlab/)$ python -m ipykernel install --user --name=open-mmlab --display-name="Python (open-mmlab)" ``` **重新打开 Jupyter 工作空间页面后**可以看到有了额外的一个选项: ![](/img/docs/2020-04-28-17-45-50.png) --- ## 算力容器数据绑定 ## 可绑定的内容 在容器创建或者重启时,可以选择绑定数据到容器里,即使是规模巨大的数据集也可以绑定进来以文件系统的方式直接访问。可以绑定的内容包含以下几类: - 公开数据集 - 个人私有的数据集 - 公开教程的工作目录 - 个人私有的执行的工作目录 - 上传新的代码 如下图所示,在容器的「数据绑定」界面,所有可供绑定的数据都会被列出,同时你也可以通过名称、ID 等字段进行筛选。 ![筛选](/img/docs/gear-databinding-1.png) ## 绑定到工作目录 每次容器执行任务时,都会创建一个独立的存储空间并绑定到 `/openbayes/home` 目录,这被称为其**工作目录**。此目录也以**软链接**的方式指向 `/openbayes/home` 目录。执行关闭后,工作目录中的内容会被保存下来,这就是所谓的执行「工作目录」。 请注意,绑定到工作目录实际上涉及到数据的复制过程,因此,容器的启动时间可能会因绑定的数据量的大小而变化,并且这也会占用工作目录的存储空间。 ## 绑定到数据目录 ![数据绑定](/img/docs/databinding-example.png) 除了工作目录之外,你还可以在创建容器时选择将数据绑定到以下根目录: - `/openbayes/input/input0` - `/openbayes/input/input1` - `/openbayes/input/input2` - `/openbayes/input/input3` - `/openbayes/input/input4` ## 路径对应关系速查 为了避免把“容器里的真实目录”和“创建 Job 时填写的挂载路径”混在一起,可以先记住下面这组对应关系: - `/output` 等价于 `/openbayes/home` - `/input0` 等价于 `/openbayes/input/input0` - `/input1` 等价于 `/openbayes/input/input1` - `/input2` 等价于 `/openbayes/input/input2` - `/input3` 等价于 `/openbayes/input/input3` - `/input4` 等价于 `/openbayes/input/input4` 其中最重要的是两类目录: - 工作目录:`/output` 或 `/openbayes/home` - 输入目录:`/input0` ~ `/input4` 或 `/openbayes/input/input0` ~ `/openbayes/input/input4` 你可以把它理解为: - `/output` / `/openbayes/home` 是“当前这次执行自己的工作区” - `/input*` / `/openbayes/input/input*` 是“挂载进来的外部数据入口” 一个典型场景如下: ```text 读取训练数据: /input0/train.csv 读取预训练模型: /input1/model.bin 保存训练结果: /output/checkpoints/ 保存最终模型: /output/final-model/ ``` 如果你在命令、Notebook 或代码里看到两套写法,不必困惑,它们只是同一批目录的两种表示方式。 ## 数据绑定格式说明 在 Job 或 Workspace 中,一个数据绑定通常由两个核心字段组成: - `name`:绑定源标识,用来确定绑定的是哪个数据集或哪个 Job 输出 - `path`:绑定到容器中的挂载路径 ### `name` 的格式 常见的绑定源有两类: 1. 数据集版本: ```text // ``` 例如:`alice/mnist/3` 2. Job 输出: ```text /jobs//output ``` 例如:`alice/jobs/preprocess-job/output` 其中: - `owner`:资源所属用户名 - `dataset-ref`:数据集标识,推荐使用数据集 ID - `job-ref`:Job 标识,推荐使用 Job ID - `version`:数据集版本号,通常为数字 :::tip 使用建议 如果你是在页面中选择数据绑定,系统会自动填充可用标识;如果你是手工编写 CLI、YAML 或 API 参数,推荐优先使用 ID,而不是名称,以避免空格、转义或歧义问题。 ::: ### `path` 的格式 支持的挂载路径如下: - `/output` - `/input0` - `/input1` - `/input2` - `/input3` - `/input4` 其中: - `/output` 表示工作目录,对应容器内的 `/openbayes/home` - `/input0` ~ `/input4` 表示只挂载数据的输入目录 更直白地说: - 需要把本次执行产生的代码、模型、日志整理结果长期保留下来时,优先写到 `/output` - 需要读取数据集、模型仓库、其他 Job 的产物时,通常挂到 `/input*` - 如果只是消费数据,不建议把大数据直接拷贝到 `/output`,否则会增加工作目录体积和后续重启成本 同时也兼容 `openbayes` 路径写法,例如可以把 `/output` 写成 `/openbayes/home`,把 `/input0` 写成 `/openbayes/input/input0`。其余路径与上文“路径对应关系速查”一一对应。 :::caution 注意 同一个 Job 请求里,挂载路径不能重复;例如不能同时把两个不同的绑定都挂载到 `/input0`。 ::: 数据目录的绑定有两种模式: 1. 读写(read-write)绑定:允许你对绑定的数据进行添加、更新、删除操作。 2. 只读(read-only)绑定:你只能读取绑定的数据,无法进行添加、更新、删除操作。 ### 读写绑定 对于具有读写权限的数据集或模型,你可以选择「读写绑定」。此模式下,你可以直接访问对应的目录并更新数据。以下场景适合使用读写绑定: 1. 对上传的原始数据集进行预处理,删除不需要的数据。 2. 绑定两个数据集,从一个数据集中抽取部分数据,然后保存到另一个数据集中。 3. 创建一个空的数据集版本,然后将容器中的数据保存到其中。 4. 创建一个空的数据集版本,然后使用 rsync 命令将本地的数据复制到其中。 :::warning 注意 只有拥有读写权限的数据集或模型才能进行读写绑定。对于没有读写权限的公共数据集,以及其他执行的工作目录,你只能进行「只读」绑定。 ::: :::info 读写绑定使用建议 1. **大数据集处理** - 当需要处理的数据超过工作空间(`/openbayes/home`)容量限制时 - 创建一个空的数据集,以读写方式绑定到 input 目录 - 直接将处理结果写入到绑定目录,避免占用工作空间 2. **数据持久化** - 对于需要长期保存的重要数据 - 对于需要在多个容器之间共享的数据 - 建议创建专门的数据集进行管理,而不是存放在工作目录 3. **性能考虑** - 读写绑定的数据会直接写入数据仓库,不会占用工作空间 - 适合需要频繁读写的大型数据集 - 可以避免容器关闭时的数据同步开销 ::: ### 只读绑定 对于没有读写权限的公开数据集、公开模型、以及其他人创建的公开教程等,你只能进行「只读绑定」。此模式下,你只能读取数据,无法进行添加、更新、删除操作。 ![只读绑定](/img/docs/read-only-binding-example.png) 如上图所示,对于只读绑定的数据,容器创建页面会显示相应的提示信息。 --- ## 环境变量与 Secret 变量 在创建或配置算力容器(任务、Jupyter 工作空间)时,可以在「环境变量」区域为执行注入一组 `变量名称 / 变量值` 形式的环境变量,用于控制容器的行为,例如传入第三方服务的 Token、模型仓库地址等。 每个环境变量都有一个**类型**,分为**明文**与 **Secret** 两种,由变量右侧是否勾选「Secret」决定。两种类型的区别如下: | | 明文变量 | Secret 变量 | | --- | --- | --- | | 存储方式 | 明文保存 | 保存后无法再读取明文 | | 页面展示 | 明文显示 | 全程脱敏显示(如 `hf••••23`) | | 注入方式 | 注入为环境变量,并写入 `openbayes_params.json` | 仅作为环境变量注入,**不写入** `openbayes_params.json` | 因此,密钥、Token 等不希望被他人读到的内容应设为 Secret 类型;而像超参数这类需要被程序读取或记录的内容用明文类型即可。关于 `openbayes_params.json` 与明文参数如何被程序读取,参见 [`parameters`](/docs/cli/config-file/#parameters)。 ## 配置环境变量 在容器的创建 / 配置页面找到「环境变量」区域: 1. 点击「添加环境变量」,填写「变量名称」和「变量值」; 2. 选择变量类型:默认为明文类型;如果是密钥、Token 等敏感信息,勾选其右侧的「Secret」将其设为 Secret 类型; 3. 可以添加多个变量,提交后随容器一同保存。 ## Secret 变量的脱敏与读取 Secret 变量一旦保存,平台不再以明文返回它的值。有编辑权限的成员在页面各处只会看到脱敏后的占位内容: - 脱敏后只保留**头尾各 2 个字符**,中间以 `••••` 代替(如 `hf••••23`); - 当原值长度不足 8 位时整体以 `••••••` 显示,不泄露真实长度。 没有编辑权限的成员则完全读取不到该值,接口直接返回 `null`。 脱敏值仅用于展示,**不是变量的真实值**。容器运行时注入的始终是当初保存的原始值。 ## 重启与克隆时的 Secret 处置 是否沿用原 Secret 的真实值,取决于这次操作是**重启同一个执行**,还是**创建一个新的执行**。 ### 重启工作空间 对已关闭的工作空间再次启动(「快速启动」或「修改配置并启动」,参见 [Jupyter 工作空间的重启](/docs/gear/workspace/#jupyter-工作空间的重启))属于同一个执行的延续,会**沿用上一次保存的 Secret 真实值,无需重新输入**: - **快速启动**:直接沿用上一次的全部配置,Secret 的真实值由平台在服务端自动回填。 - **修改配置并启动**:Secret 以脱敏、只读的形式列出并默认沿用。如需更换,点击该变量的「替换」输入新值,点击「取消替换」可恢复为沿用原值。 ### 克隆 / 新建执行 以下操作都会生成一个**全新的执行**,因此**不会带过来原 Secret 的真实值**: - 从公共教程、公共资源克隆; - 克隆他人的配置并启动、从自动建模克隆; - 从某次执行「继续执行 / 自此克隆」创建新执行。 这些情况下,克隆者本就无法读取原 Secret 的明文,平台也不会把它带到新执行中。页面会保留变量名并提示「原 Secret 值无法保留,请输入新值」,你需要为每个 Secret 变量**填写自己的值**,或删除不需要的变量后再启动。明文变量则会照常带入新执行。 ### 修改变量类型 变量的类型可以在明文与 Secret 之间切换: - **明文改为 Secret**:勾选「Secret」即可,已填写的值会作为该 Secret 的值保存。 - **Secret 改为明文**:取消勾选「Secret」。由于已保存的 Secret 原值无法再读取,切换后原值会被丢弃,需要重新填写该变量的值(页面会先弹窗确认)。 ## 限制 - `OPENBAYES_`(不区分大小写)为平台保留前缀,不可用作自定义环境变量的名称。 --- ## 自定义端口映射与服务暴露 ## 功能概述 OpenBayes 的「模型训练」提供自定义端口映射功能,可以将容器内运行的服务(如 Web 应用、API 服务、可视化工具或大语言模型)暴露到外部网络。此功能是算力容器的核心特性之一,适用于工作空间和批量任务等多种场景,专为提升开发体验和服务部署效率而设计。 :::important 实名认证要求 使用自定义端口映射功能需要完成实名认证。未完成实名认证的用户将无法使用此功能。请在使用前确保您已完成实名认证流程。 ::: 此功能支持: - 同时暴露 Gear 容器内的多个端口 - 通过格式化的子域名访问服务 - 支持 HTTP、WebSocket 等多种协议 ## 配置端口映射 ### 创建 Gear 容器时设置 在创建新的 Gear 容器时,可以在「端口映射」部分配置要暴露的端口: ![增加端口映射](2025-02-28-19-28-09.png) 配置步骤: 1. 在「创建容器」页面,找到「端口映射」部分 2. 点击「配置端口映射」按钮 3. 填写以下信息: - **映射名称**:端口映射的唯一标识名 - **端口号**:容器内服务监听的端口 默认情况下,Job 的 `8080` 端口已经对外暴露,通常不需要再手动配置该端口映射。页面中的「API 地址」访问的就是这个 `8080` 服务。 :::caution 注意 不同的容器的映射名称不能重复设置,否则会产生报错。 ::: ### 端口映射限制 - 保留端口(无法进行映射):22、80、5901、6006、6637、7088、8888 - 每个 Gear 容器最多可配置 5 个自定义端口映射 ## 访问方式 Gear 容器状态显示为「运行中」后,系统会自动生成访问地址。 ### 子域名访问 子域名访问方式的格式取决于是否提供了端口映射名称: #### 提供了映射名称时 ```text https://{user}-{port_name}.{domain} ``` 参数说明: - `{user}` - 用户名 - `{port_name}` - 为端口映射指定的名称 - `{domain}` - OpenBayes 实例的基础域名 示例:用户名为 `openbayes`,端口映射名称为 `gradio`,基础域名为 `gear-c1.openbayes.net`,则访问地址为: ```text https://openbayes-gradio.gear-c1.openbayes.net ``` #### 未提供映射名称时 ```text https://{user}-{jobid}-{port_number}.{domain} ``` 参数说明: - `{user}` - 用户名 - `{jobid}` - Gear 容器的作业ID - `{port_number}` - 容器内部端口号 - `{domain}` - OpenBayes 实例的基础域名 示例:用户名为 `openbayes`,容器 jobid 为 `84xr8451agrz`,内部端口为 `7860`,基础域名为 `gear-c1.openbayes.net`,则访问地址为: ```text https://openbayes-84xr8451agrz-7860.gear-c1.openbayes.net ``` ### 查看配置的访问地址 Gear 容器详情页面可查看所有配置的端口映射及其访问地址: ![容器端口映射页面](container-port-mapping.png) ## 应用示例 ### 部署 Gradio 应用 以下是在 OpenBayes Gear 上部署并暴露 Gradio 应用的步骤: 1. 安装 Gradio: ```bash pip install gradio --user ``` 2. 创建应用文件 `app.py`: ```python import gradio as gr def greet(name): return "Hello " + name + "!!" demo = gr.Interface(fn=greet, inputs="text", outputs="text") # 必须绑定到 0.0.0.0 才能从外部访问 demo.launch(server_name="0.0.0.0", server_port=7860) ``` 3. 运行应用: ```bash python app.py ``` 4. 通过之前配置的端口映射访问应用(假设端口 7860 已配置为 "gradio" 端口映射)。 ### 部署大语言模型 API 服务 #### vLLM 服务 ```bash # 使用自定义端口启动服务 vllm serve \ --host 0.0.0.0 \ --port 8080 ``` #### SGLang 服务 ```bash # 启动服务并指定端口 python -m sglang.launch_server \ --model-path \ --host 0.0.0.0 \ --port 8080 ``` ### 使用 OpenAI 兼容接口访问 LLM 服务 如果您在 Gear 中部署的 LLM 服务(如 vLLM、SGLang)提供了 OpenAI 兼容的 API,可以通过以下方式访问: 1. 获取可用模型列表: ```text https://{user}-{port_name}.{domain}/v1/models ``` 或者(如果未指定映射名称): ```text https://{user}-{jobid}-{port_number}.{domain}/v1/models ``` 2. 使用 Python OpenAI SDK 访问: ```python from openai import OpenAI # 根据您的访问方式选择对应的基础 URL # 提供了映射名称: base_url = "https://{user}-{port_name}.{domain}/v1" # 未提供映射名称: # base_url = "https://{user}-{jobid}-{port_number}.{domain}/v1" model_name = "your-model-name" # 从 /v1/models 获取的模型名 client = OpenAI( base_url=base_url, api_key="EMPTY" # 许多开源模型服务不需要真正的 API Key ) # 发送请求 response = client.chat.completions.create( model=model_name, messages=[ {"role": "user", "content": "你好"} ] ) print(response.choices[0].message.content) ``` ## 端口映射与 SSH 隧道对比 自定义端口映射相比 SSH 隧道方法的优缺点: | 特性 | 自定义端口映射 | SSH 隧道 | | --- | --- | --- | | 配置方式 | UI 界面操作 | 命令行和 SSH 密钥 | | 多端口支持 | 支持同时暴露多个端口 | 每个端口需单独配置 | | 持久性 | Gear 运行期间持续可用 | 需保持 SSH 连接 | | 访问范围 | 公网可直接访问 | 仅在有 SSH 隧道的机器上可访问 | | 协议支持 | HTTP, WebSocket 等 | 所有 TCP 协议 | | 安全机制 | HTTPS 加密 | SSH 加密 | ## 安全性考虑 使用「模型训练」的自定义端口映射时请注意: 1. 暴露的服务可被任何知道 URL 的人访问,除非应用实现了身份验证 2. 避免暴露包含敏感数据的服务 3. 建议在应用中实现适当的安全措施(如身份验证和授权) --- ## 算力容器 FAQ(常见问题解答) ## Jupyter 执行过程中报错 Kernel Restarting 是怎么回事? 当 Jupyter Notebook 中的内核(Kernel)崩溃、停止或出现错误时,Jupyter Notebook 会自动尝试重新启动内核。在这个过程中,笔记本中所有的变量和数据都将被清除并且需要重新运行。原因可能包括代码错误、内存问题、资源限制或其他系统问题,建议您检查代码中的语法错误和逻辑错误,并**确保内存使用不会超过可用容量**。如果问题持续存在,可以尝试使用更高版本的 Python 或者升级相关依赖库等操作解决。 ## 如何找到执行程序的路径? 可以通过 `which` 命令来查找: ```bash which darknet ``` 返回结果: ``` /usr/local/bin/darknet ``` 如果文件在非标准路径,可以通过 `find` 命令查找: ```bash find / -name program ``` 更详细的使用说明请参阅 `man which` 和 `man find` ## 为何工作空间中的 Terminal 终端无法退出 Vim 的编辑模式? 根据用户反馈,如果您在工作空间的 Terminal 终端中使用 Vim 编辑文件时,如果遇到无法退出编辑模式等非常规行为(主要表现为进入插入模式 `i` 后按 `esc` - `:wq` 无法退出当前模式),建议检查 Google Chrome 浏览器中是否有安装并激活 Vimium、cVim 等 Vim 相关插件/扩展。此类插件的某些设置极有可能与工作空间中的 Terminal 快捷键冲突。 建议:禁用相关插件/扩展,或更换为其他浏览器使用 ## 为什么通过容器的「继续执行」启动后发现原来的内容不见了? 在 [为什么要有执行记录](/docs/gear/records/#为什么要有执行记录) 这里介绍了每次容器的执行都是独立的环境,而 [从指定执行记录继续执行](/docs/gear/records/#从指定执行记录继续执行) 解释了「继续执行」做了什么:将上一次执行的输入绑定到新的执行的 `/openbayes/home` 目录下。而「上一次执行」值得就是用户点击「继续执行」的那个执行了,如果这次执行没有任何的输出内容,那么新的执行内必然也没有相应的数据了。这种情况可能是因为点击「继续执行」的执行本身是没有开启就关闭了,而再上一个容器则是有实际数据的。 例如我创建了一个新的容器 **cifar10** 并且创建了一个执行:第一次执行,以 Jupyter 工作空间的形式打开了,我写了一个 .ipynb 文件后就关闭了。 一个小时后我点击「第一次执行」的「继续执行」打开这个容器,在这次执行处于「准备中」的状态时我发现我的算力类型选错了,我立即点击了关闭,这个时候我的容器中有了第二次执行。 然后我又在「第二次执行」的页面点击了「继续执行」,当容器开启之后发现我的 `/openbayes/home` 目录是空的。**那是因为第二次执行是异常关闭的,根本没有机会去同步第一次执行的内容**,因此**正确的做法是在「第一次执行」处点击「继续执行」开启容器**。 ## 为什么再次开启容器我原来安装的内容就没有了? 在 [为什么要有执行记录](/docs/gear/records/#为什么要有执行记录) 这里介绍了每次容器的执行都是独立的环境,原来手工安装的依赖包会消失。如果希望每次开启容器都有相关的依赖的话,参考 [如何添加不在列表中的依赖](/docs/runtimes/#如何添加不在列表中的依赖) 。同时,我们也会周期性更新镜像,把越来越多通用的依赖添加进来。 ## 为什么我的容器一直处于「准备中」的状态? 容器启动长时间处于准备中的状态可能有以下可能: 1. 将大量的文件绑定到了 `/openbayes/home` 容器在启动阶段拷贝大量的数据到 `/openbayes/home` 耗费时间,尤其是大量的小文件的拷贝可能会非常的耗时,同时在具体的执行的页面也会看到现实「数据同步」并展示当前数据同步的速度。如果对相应的数据没有写的需求,建议创建为数据集并绑定到 `/intput0-4` 以避免拷贝的过程,在 [算力容器的工作目录 - 将工作目录创建为数据仓库版本](/docs/gear/output#将工作目录创建为数据仓库版本) 可以看到如何从容器的「工作目录」创建新的数据集版本。 2. 容器处于冷启动状态,启动容器的机器目前没有容器所需要的镜像,正在拉取镜像。虽然我们已经在集群内增加了镜像节点提升镜像获取的时间,但是在这种冷启动状态依然会有 3 - 5 分钟的时间耗费在镜像拉取上,同时在具体的执行页面也会看到这个执行处于「拉去镜像」的状态。 3. 网络问题,由于内部网络抖动导致容器的创建过程出现问题,如果排除了以上两种可能(即自己没有加载大量数据到 `/openbayes/home` 但是过了 5 分钟 10 分钟容器还没启动起来),那么可以尝试重启容器或者在界面的聊天窗口咨询客服人员。 ## 为什么我的容器一直处于「拉取镜像」的状态? 当您的容器长时间处于「拉取镜像」状态时,这通常与冷启动有关。冷启动是指您所请求的计算节点上尚未缓存您所需的容器镜像,系统需要从镜像仓库下载完整镜像。 这种情况是正常的,特别是对于: 1. 首次使用特定类型的环境或框架 2. 使用较新版本的镜像 3. 使用较大体积的特殊镜像 **正常情况下**,拉取镜像的过程通常需要 3-5 分钟完成,具体时间取决于镜像大小和当前网络状况。在此期间,请耐心等待系统完成镜像拉取和容器初始化。 **异常情况**:如果容器超过 10 分钟仍然处于「拉取镜像」状态,可能是由于以下原因: 1. 镜像仓库暂时不可用 2. 系统资源调度出现问题 此时,建议您: 1. 刷新页面查看最新状态 2. 尝试重启容器创建流程 3. 如果问题持续存在,请联系平台管理员或通过界面聊天窗口与客服人员联系,提供您的容器ID和详细情况 ## 为什么我的容器一直处于「同步数据并关闭」的状态? 这种情况通常和容器打开缓慢是同样的原因,就是将大量的文件绑定到了 `/openbayes/home`,当容器在关闭时需要同步大量的数据。大量的数据同步,**尤其是大量小文件的同步**非常耗时,如果对相应的数据没有写的需求,建议创建为数据集并绑定到 `/intput0-4` 以避免拷贝的过程。 在 [算力容器的工作目录 - 将工作目录创建为数据仓库版本](/docs/gear/output#将工作目录创建为数据仓库版本) 可以看到如何从容器的「工作目录」创建新的数据集版本。 如果容器内文件不多依然出现了这种情况,那么请在界面的聊天窗口咨询客服人员。 ## 如何上传、查看、预览 .ipynb 文件? 您可以通过两种方式上传: 在算力容器模式中,您可以创建一个新的算力容器,接入方式选择 [工作空间](/docs/gear/workspace) ,然后在容器启动完成后打开工作空间,在工作空间中上传 `.ipynb` 文件 如果是在预训练模型中,您可以在上传的时候直接将 .ipynb 打包到 Zip 文件中并上传,上传完成后在预训练模型的文件列表中即可访问该 notebook,稍后您也可以通过创建新的容器并绑定该预训练模型,在工作空间中进行交互操作 ## 容器中的存储空间和从「资源使用状况」中看到的空间怎么不一样,他们是什么关系? 容器中的存储空间是开启一个容器后对应的「工作目录」(`/openbayes/home` 目录)**工作空间大小**,对于特定的算力资源其空间是固定的,例如「T4」类型的算力资源其工作空间是 50GB。而「资源使用状况」中反应的是**用户全局存储空间**。容器的存储空间是在用户开启容器的时候所使用的,容器在关闭后其「工作目录」(`/openbayes/home` 目录)中的数据会被同步到**用户全局存储空间**并占据相应的额度;另一方面,用户上传数据集也是直接计算在**用户全局存储空间**额度中。 当用户的全局存储空间超出限额后,用户将不再能够创建容器、上传数据集,可以通过删除执行、删除数据集等方式释放空间。 ## 为什么我的容器卡死了,甚至连 Jupyter 工作空间的页面也打不开? 容器的计算资源(CPU、GPU、内存)都是固定的。如果有程序占满了 CPU 资源,那会导致其他的进程受到严重的影响。比如有些程序会一口气占满所有的 CPU 资源,那么 Jupyter 工作空间自身程序就会变得非常卡顿,甚至导致 Jupyter 工作空间的页面也无法打开。所以如果发现自己的 Jupyter 工作空间页面无法打开,首先检查一下容器的 CPU 是不是在满负荷运行(在容器页面会展示 CPU、内存等重要指标)。 如果容器非常卡顿甚至无法打开 Jupyter 工作空间页面,可以尝试[采用 SSH 的方式](/docs/gear/ssh)登录容器。如果依然无法登录,则可以尝试重启容器。 ## 为什么我的「工作空间」没有自动关闭? 「工作空间」自动关闭需要满足两个条件: 1. Jupyter 页面被关闭 2. CPU 使用率持续接近于 0 注意,如果 Jupyter 的页面在浏览器中并没有关闭,会被系统认为「工作空间」依然是在被使用的,不会触发空闲关闭的。 ## 为什么我的 GPU 利用率非常低,如何提高利用率 在深度学习训练与推理中,GPU 利用率低下是常见问题。根据我们对大量生产环境的分析,超过 80% 的 GPU 低效问题源于 CPU-GPU 协同流水线设计缺陷。下面从三个维度提供优化策略: ### 数据加载优化 #### 存储读取策略 当训练数据存储于分布式文件系统时,跨城访问延迟可达 50-200ms。以 ImageNet 数据集为例,A100 GPU 的 SM 利用率可能从 95% 跌至 32%。**优化方案**: - **本地缓存**:在计算节点内存缓存数据,并将小文件合并为 TFRecord 格式读取 - **并行预读**:设置 `num_workers=CPU核心数×0.8`,`prefetch_factor` 适当调高 #### 内存传输加速 ```python from torch.utils.data import DataLoader DataLoader(dataset, num_workers=8, pin_memory=True, # 关键参数 persistent_workers=True, prefetch_factor=2) ``` 该配置可使数据加载延迟降低 75%,GPU 空闲时间大幅减少。 ### 计算调度优化 #### 异步操作设计 模型保存、日志打印等 CPU 操作会阻断 CUDA Stream。**优化措施**: ```python # 异步保存模型 with ThreadPoolExecutor(max_workers=1) as executor: executor.submit(torch.save, model.state_dict(), "checkpoint.pt") ``` #### 批处理规模调整 过小的 batch size 无法充分利用 GPU 并行能力,过大则可能导致显存溢出。**最佳实践**: - 从小批量开始,逐步增加至显存占用 80% - 使用梯度累积增加等效批量:`loss.backward(); optimizer.step() if (i+1) % accumulation == 0 else None` ### 系统参数调优 以下环境变量对性能影响显著: ```bash # 基础 CUDA 参数优化 export CUDA_DEVICE_MAX_CONNECTIONS=1 # 减少上下文切换开销 export CUDA_CACHE_DISABLE=0 # 启用 CUDA 内核缓存,提高重复计算速度 export CUDA_VISIBLE_DEVICES=0,1,2,3 # 指定要使用的 GPU 设备 ID # NCCL 通信优化(多卡训练) export NCCL_P2P_DISABLE=0 # 启用点对点通信 export NCCL_IB_DISABLE=0 # 启用 InfiniBand 传输 export NCCL_DEBUG=INFO # 调试阶段可开启,生产环境建议关闭 export NCCL_SOCKET_IFNAME=eth0 # 指定网卡接口,避免选择错误接口 # 并行计算优化 export OMP_NUM_THREADS=8 # 限制 OpenMP 线程数,避免与 DataLoader 争抢 export MKL_NUM_THREADS=8 # 限制 MKL 线程数,同样避免资源争抢 ``` 使用 PyTorch 时,还可通过代码设置以下参数: ```python # 优化 CUDA 内存分配策略 torch.backends.cudnn.benchmark = True # 对固定输入尺寸有显著加速 torch.backends.cudnn.deterministic = False # 非确定性模式通常更快 torch.cuda.set_per_process_memory_fraction(0.9) # 预留部分显存,防止 OOM ``` ### 性能诊断工具 采用 PyTorch Profiler 定位瓶颈: ```python with torch.profiler.profile( activities=[torch.profiler.ProfilerActivity.CUDA], schedule=torch.profiler.schedule(wait=1, warmup=1, active=3) ) as prof: for step, data in enumerate(dataloader): outputs = model(inputs) prof.step() ``` 分析时重点关注: - `CPU Exec` 与 `GPU Exec` 时间差异 - `cudaMemcpyAsync` 调用频率 - GPU 核心利用率波动情况 最佳的 GPU 利用率应保持在 85% 以上,波谷持续时间少于 50ms,这表明数据处理流水线运行良好。 ## 我的两个容器之间可以相互访问吗 是的,您的容器之间可以相互访问。 1. **获取目标容器的 IP 地址**: 登录到目标容器(您想要连接的容器),在 Terminal 中执行: ```bash ip a ``` 如果提示命令不存在,先安装网络工具: ```bash apt install iproute2 -y ip a ``` 在输出中找到 `eth0` 接口对应的 IP 地址(例如 `10.38.6.87`)。 2. **从源容器建立连接**: 在另一个容器(发起连接的容器)中,使用 SSH 连接到目标容器: ```bash ssh 10.38.6.87 ``` :::info 同一个创建人的容器之间已经预配置了 SSH 密钥,无需密码即可直接连接。 ::: 3. **在容器间传输文件**: ```bash # 从当前容器复制文件到目标容器 scp /path/to/local/file 10.38.6.87:/path/to/remote/ # 从目标容器复制文件到当前容器 scp 10.38.6.87:/path/to/remote/file /path/to/local/ # 使用 rsync 同步目录 rsync -avz /path/to/local/dir/ 10.38.6.87:/path/to/remote/dir/ ``` 更多详细说明请参考 [容器间通讯](/docs/gear/internal-ssh) 文档。 ## 可否使用我自己的镜像 目前平台的普通用户暂时无法直接使用自定义镜像。我们已经预置了多种常用框架和版本的镜像,包括: - **深度学习框架**:TensorFlow、PyTorch、MXNet 等各主流版本 - **大语言模型框架**:vLLM、SGLang 等 - **其他框架**:PaddlePaddle、Darknet 等 对于自定义镜像的需求,我们提供以下解决方案: 1. **针对普通用户**: - 使用 `pip install --user` 安装 Python 依赖,这些依赖将保存在用户目录下 - 创建自定义独立环境([Conda](/docs/gear/conda) 或 [uv](/docs/gear/uv),取决于运行时类型)并放置在 `/openbayes/home` 目录 - 在启动脚本中添加必要的依赖安装命令 2. **专有部署用户**: - 支持完全自定义的镜像定制服务 - 所有自定义镜像必须基于 Ubuntu 操作系统构建 - 可根据企业特定需求定制环境、依赖和配置 3. **针对企业用户**: - 我们的[企业私有部署](/enterprise)服务提供定制化镜像支持 - 企业用户可以基于我们的基础镜像构建自定义 Docker 镜像 - 在模型部署时可以直接指定自定义镜像 如果您有特殊的镜像需求,建议联系客服人员咨询具体解决方案。 ## 遇到 huggingface 无法下载模型该如何解决? 如果您在使用 HuggingFace 相关功能时遇到连接错误,可以通过设置镜像来解决: 1. **安装依赖** ```bash pip install -U huggingface_hub ``` 2. **设置环境变量** ```bash export HF_ENDPOINT=https://hf-mirror.com ``` --- 1. **使用示例** ```bash huggingface-cli download --resume-download gpt2 --local-dir gpt2 ``` 对于数据集下载: ```bash huggingface-cli download --repo-type dataset --resume-download wikitext --local-dir wikitext ``` --- ## 算力容器介绍 ## 容器的执行模型 算力容器作为一个计算单元,可以执行各种各样的计算工作,包括数据预处理,机器学习模型的训练,利用已有模型对未标注数据进行推理等,其构成包含以下几个重要元素: 1. 基本的硬件配置,目前包括 CPU、GPU、内存、存储四大元素,通过[算力类型](/docs/concepts/#算力)指定。 2. 基本的运行时环境,主要就是选择想要采用的深度学习框架以及其配套的周边依赖,通过[镜像](/docs/concepts/#镜像)指定,具体的依赖列表参见[运行时环境](/docs/runtimes/)。 3. 所需要的代码、数据,通过绑定[数据](/docs/concepts/#数据仓库-data-warehouse)、绑定其他容器执行的[「工作目录」](/docs/concepts/#容器的「工作目录」)或者直接上传代码提供。 容器每次的执行都会重新分配存储并将存放在这次执行容器中的数据保存下来,因此每个容器下的各个执行是相互独立的,结合[自定义参数](/docs/gear/metrics/#自定义-metrics)和[`Parameters`](/docs/cli/config-file/#parameters) 等工具,如果使用得当可以大大提升机器学习实验的可复现性。但如果没有对这些概念有很好的了解可能会导致数据在各个执行之间来回复制,既拖慢了容器运行的速度也大大增加了额外的非必要数据存储开销。 ![执行记录](/img/docs/gear-index-1.png) ## 容器的创建 容器目前支持两种方式:「Python 脚本执行」和「Jupyter 工作空间」。两者默认的工作目录都是系统中的 `/output` 目录(同时会在 `/openbayes/home` 设置软链接,即 `/openbayes/home` 与 `/output` 为同一个目录)。 容器可以创建多个「执行」,每个「执行」都是独立的容器,可以有独立的算力配置、镜像。而每次「执行」在被关闭后其工作目录 `/openbayes/home` 下的内容将被保存下来,可以通过页面的「工作目录」选项卡查看。 ![工作目录页面](/img/docs/gear-index-2.png) :::info 容器执行时其工作目录为 `/openbayes/home`,所以对其他数据仓库的引用 `/openbayes/input/input0-4` 需要用绝对路径,而上传的代码则可以用相对目录执行。 举个例子,在创建「Python 脚本执行」时上传了一个名为 `train.py` 的文件,文件中需要读取 `/openbayes/input/input0` 目录下的数据,那么在执行时需要用绝对路径 `/openbayes/input/input0/` 来引用。而如果需要直接执行该文件则可以直接使用相对路径 `python train.py` 而不必使用 `python /openbayes/home/train.py`。 ::: ## 数据绑定 见 [算力容器数据绑定](/docs/gear/databinding)。 ## 环境变量 创建容器时可以配置一组环境变量来控制容器的行为,例如传入第三方服务的 Token 等。环境变量分为**明文**与 **Secret** 两种类型,Secret 用于密钥等敏感信息、会全程脱敏显示。见 [环境变量与 Secret 变量](/docs/gear/env-vars)。 ## Jupyter 工作空间 Jupyter 工作空间是我们基于 JupyterLab 开发的交互式运行环境,首先支持的编程语言是 Python 目前已经成为了大量数据科学家的默认工作环境。通过 Jupyter 工作空间访问算力容器就可以像在其他环境一样使用算力资源了。 Jupyter 工作空间支持两种环境 **Notebook** 以及 **Lab** 这里我们默认支持了 **Lab**。如果你还不知道如何使用 Jupyter 工作空间可以参见其 [文档](https://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html) 或相关的[中文翻译资料](https://zhuanlan.zhihu.com/p/33898478)。这里不我们不会穷尽使用 Jupyter 工作空间的一些内容,而是强调几个 OpenBayes 下 Jupyter 工作空间的几个关键特性。 更多信息见 [Jupyter 工作空间](/docs/gear/workspace)。 ## 继续执行 通常来说,同一个「容器」下的多次执行在业务上会存在着很大的共性。为了方便用户可以在执行历史的基础上创建新的「执行」,目前 OpenBayes 提供了「继续执行」的选项。 ![继续执行](/img/docs/gear-index-3.gif) OpenBayes 会为我们做如下事情: 1. 绑定上一次「执行」已经绑定的数据仓库到相同的位置 2. 如果上一次「执行」是一个「Python 脚本任务」,那么同样绑定相同的代码 3. 绑定上一次「执行」的「工作目录」到 `/openbayes/home` 目录 :::info 在 OpenBayes 中可以将一个算力容器的「工作目录」绑定到一个新的容器上,实现 "管道" 的效果。这里我们就是将之前的一个 "模型训练" 的「工作目录」作为了一个 "模型推断" 任务的输入。然而这种使用方式是将上一次执行的「工作目录」全部拷贝到新的容器里,这会导致所使用的存储翻倍。因此如果不需要对上一次执行的「工作目录」进行写操作,建议将其绑定到「input0-4」目录中,这将把数据以只读的方式链接到新的容器中,不会产生额外的数据用量。 ::: 除了在执行页面上使用「继续执行」外,还可以在「执行记录」页面操作。 ![删除执行](/img/docs/gear-index-4.gif) ### 在选择继续执行后修改代码的场景 「继续执行」意在方便用户在代码不变的基础上继续上一次的训练,如果在「继续执行」场景下更新了代码需要特别注意。 在点击「继续执行」后如果在这里尝试上传新的代码可能会与当前绑定的「上一次执行的工作目录」中的代码冲突。例如在上一次执行中,我们已经上传了一个名为 `main.py` 的文件,这个文件已经被保存到了上一次执行的「工作目录」里面了。如果再次上传了一个修改了的同样名为 `main.py` 的文件,那么 OpenBayes **会忽略这次修改,保留已有的文件**。 因此,如果当您使用了「继续执行」并且发现出现了执行代码与您的预期不一致的情况,可能是因为上传的代码内容被上一次容器绑定的工作目录覆盖了。如果不想出现这种情况,可以修改默认绑定的「上一次执行的工作目录」的绑定目录。 ![修改绑定目录](/img/docs/gear-index-5.png) ### 如何加速容器的启动 在容器的工作目录(/openbayes/home 或者说是 /output 两者是等价的)下保存大量的文件会影响容器的启动速度,尤其是**大量的小文件的拷贝**会非常的耗时。在容器启动进入数据拷贝的流程时,执行的状态会变更为「同步数据」,并显示相应的同步速度。 可以将数据或者模型创建单独的「数据仓库」并以数据绑定的方式绑定到 /intput0-4 以避免拷贝的过程。在 [算力容器的工作目录 - 将工作目录创建为数据仓库版本](/docs/gear/output#将工作目录创建为数据仓库版本) 可以看到如何从容器的「工作目录」创建新的数据集版本。 ## 设定通知 目前 OpenBayes 提供了两种发送通知的渠道:邮件通知以及短信通知。邮件通知被默认勾选且无法关闭,用户可以依据自己的喜好去设置短信通知。 ![短信设置](/img/docs/gear-index-6.png) ## Task 与 Jupyter 工作空间两种模式结合使用 Jupyter 工作空间模式适合即时的文件执行和修改,但是其对计算资源的使用效率不高,在用户编辑和调试的过程中其资源经常是浪费的;Python 脚本上传方式在容器开始运行后会立即执行 Python 代码,对计算资源的利用效率高,但是其修改起来非常麻烦,每次更新代码都需要重新上传。 因此建议可以在低算力模式下(CPU 算力)首先创建 Jupyter 工作空间,在其中保证代码可以正常执行后关闭资源并将其 "工作目录" 下载。然后再创建一个 Python 脚本执行模式的 GPU 算力容器上传下载的代码,执行脚本。 目前 Jupyter 工作空间已经内置了 [openbayes 命令行工具](/docs/cli/#在-jupyter-编辑器中使用命令行工具) 可以非常方便的在 Jupyter 环境通过命令行工具创建 task。 ### 将 .ipynb 文件转换为 .py 文件 选择「File」-「Export Notebook As...」-「Export Notebook to Executable Script」就可以将当前的 ipynb 文件以 py 格式下载到本地。再将其拖动到 Jupyter 工作空间左侧的文件目录中即可将该文件再次上传到容器中: ![](/img/docs/2020-02-05-19-14-09.png) 可以看到 ipynb 的代码片段都被串联起来保存在 .py 文件中了。 ### 通过 Jupyter 工作空间内置的命令行工具创建 task 见 [创建 Python 脚本](/docs/cli/#创建python-脚本执行) 章节。 ## 公开容器 ![公开容器](/img/docs/gear-index-7.png) 容器创建时默认为「私有容器」,在容器的`「设置」`界面允许将容器设置为公开容器,处于安全的考虑,公开容器只允许所有注册用户看到**已经关闭了的容器执行**。 ## 容器的终止 容器在执行的任何过程都可以被终止,但是请注意,容器终止可能会导致部分数据结果没有同步成功,请在容器的「工作目录」标签页确认其当前数据的完整性后再终止容器。 ![终止容器](/img/docs/gear-index-8.gif) ## 容器的删除 容器在执行完毕之后会自动释放所占有的算力资源,然而通常来说,容器执行完毕后都会有一些文件保存下来以备他用。工作目录会占用用户的存储资源。如果认为整个「容器」的数据都不再需要了,可以在「容器」的「设置」选项卡中删除整个容器,容器删除后将会释放整个容器所占有的用户存储资源。 :::danger 注意 这项操作非常危险,容器删除后的数据将不可恢复! ::: ![删除容器](/img/docs/gear-index-9.png) --- ## 容器间通讯 如果需要两个运行中的容器之间传递数据,最方便的方法是通过 `ssh / scp` 或者 `rsync`。 ## 获取目标容器 IP 首先登录**目标容器**(你想要连接的容器),打开 Terminal 执行如下内容查看容器 IP: ```bash ip a ``` 如果提示 `ip` 命令不存在,需要先安装: ```bash apt install iproute2 -y ip a ``` 可以得到如下结果: ```txt 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: tunl0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0 4: eth0@if96: mtu 1440 qdisc noqueue state UP group default link/ether 2a:d7:3a:68:13:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.38.6.87/32 scope global eth0 valid_lft forever preferred_lft forever ``` 在输出结果中找到 `eth0` 对应的 IP 地址,这里是 `10.38.6.87`。 ## 从其他容器连接 然后在**另一个容器**(发起连接的容器)中,通过以下命令连接到目标容器: :::info 同一个创建人的容器之间已经准备好了密钥,不需要密码或者 `-i` 参数,可以直接连接。 ::: ```bash ssh 10.38.6.87 ``` 连接成功后,你就可以在容器之间传输文件了: ```bash # 从当前容器复制文件到目标容器 scp /path/to/local/file 10.38.6.87:/path/to/remote/ # 从目标容器复制文件到当前容器 scp 10.38.6.87:/path/to/remote/file /path/to/local/ # 使用 rsync 同步目录 rsync -avz /path/to/local/dir/ 10.38.6.87:/path/to/remote/dir/ ``` --- ## 算力容器的限额 算力容器在运行时既受到账号额度的影响,也受到资源配额限制的影响。 如果你想了解完整的账号级 limitation 概念,包括资源并行限制、GPU 限制、数据集 / 容器个数限制、组织个数限制以及快照限制,请参考 [配额限制](/docs/limitations)。 ## 算力配额 用户在不同资源下的额度余额可在「账号设置」-「资源使用状况」页面查看: ![](/img/docs/gear-limitation-1.png) 运行系统会优先从该页面所展示的算力资源中扣费,默认每小时进行一次扣费。当这里的算力时间配额用尽时,系统会开始从用户的余额中扣费。如果用户的余额不足以支付当前运行的算力资源,系统将会停止运行该算力容器。 ## 算力资源的并行限制 算力容器会受到具体资源类型的并行限制。例如 `cpu`、`cpu-xlarge`、`rtx-4090`、`a6000` 等资源,都可能分别配置不同的上限。 当某个资源已经达到上限时,再次创建对应容器会报错,例如: `资源 RTX-3090 超出个人限制` ![](/img/docs/gear-limitation-3.png) 更完整的 limitation 说明,包括 GPU 限制与资源限制的关系,见 [配额限制](/docs/limitations)。 ## 容器的自动清理 当容器下的所有执行都已关闭,即没有活跃的执行时,该容器将开始自动清理流程。如果在指定时间内没有新的执行开启,或者没有对执行记录进行任何清理,那么该容器将被视为无用,并将在指定的清理时间后被系统自动删除。 ![](/img/docs/inactive-project-detail-view.png) 在容器列表页面,也可以看到相应的提醒。 ![](/img/docs/inactive-project-remind.png) 创建新的执行,或者重启该容器下的工作空间,都会刷新该容器的自动清理时间。 ## 不会被自动清理的容器 **如果容器上没有自动清理的标记,则意味着该容器不会被自动清理。** 以下情况下的容器都不会被自动清理: 1. 公开的容器 2. 组织下的容器 **数据仓库不在自动清理的范畴内,不会被自动清理。** --- ## 系统指标与自定义指标 ## 展示关键的 Metrics OpenBayes 默认提供了执行时的关键指标的展示,目前支持的有 CPU 、内存、`gpu-0-memory`、`gpu-0-util` 以及 存储资源。未来将支持更多的指标。 ![](/img/docs/gear-metrics-1.png) ### 自定义 Metrics OpenBayes 提供一个 Python 的库 openbayestool 用于在 Python 程序中自定义记录一些关键的 metrics 并展示到用户的容器执行页面之上: ![](/img/docs/gear-metrics-2.png) openbayestool 使用方式如下所示: ```py from openbayestool import log_param, log_metric, clear_metric # 记录参数 `learning_rate=0.01` log_param('learning_rate', 0.01) # 同一参数将会记录最后一个请求的结果 `foo=3` log_param('foo', 1) log_param('foo', 2) log_param('foo', 3) # 记录模型的运行结果 `precision=0.77` log_metric('precision', 0.77) # 同一个结果 precision 多次记录会追加结果,即结果为 [0.79, 0.82, 0.86] log_metric('precision', 0.79) log_metric('precision', 0.82) log_metric('precision', 0.86) # 清理一个自定义的 metric,注意只有在运行中的容器中可以这么做 clear_metric('precision') ``` ### 和 Keras 结合 Keras 框架提供了 [Callback API](https://keras.io/callbacks/) 可以创建按照 batch 或者 epoch 级别的更新回调。利用这个方式,我们就可以把 `openbayestool` 中的自定义 metrics 添加到 keras 的训练过程中了。 ```py class OpenBayesMetricsCallback(tf.keras.callbacks.Callback): def on_batch_end(self, batch, logs=None): """Print Training Metrics""" if batch % 300 == 0: openbayestool.log_metric('acc', float(logs.get('acc'))) openbayestool.log_metric('loss', float(logs.get('loss'))) model.fit(x_train, y_train, epochs=epochs, verbose=1, callbacks=[OpenBayesMetricsCallback()]) ``` 在 [这里](https://github.com/signcl/openbayes-mnist-example/blob/master/pytorch/train.py) 可以看到完整的代码示例。 --- ## 算力容器的工作目录 每次「执行」开始运行之后其运行时环境都会绑定其目录 `/openbayes/home`,作为容器的「工作目录」。该目录下的内容会在「执行」关闭后被保存下来,并可以通过页面中的「工作目录」选项卡查看。 ![](/img/docs/gear-output-1.png) ## 关键文件的展示 「执行」中的一些关键文件会被展示到容器的页面中,如果一个容器中有多个「执行」那么最新的「执行」的文件文件将会被展示出来。 ### 展示默认的 README.md 容器在关闭后会自动查找 `/openbayes/home/README.md` 文件,并将其内容展示在容器的页面中,该文件需要遵循 `markdown` 语法。 ![](/img/docs/show-readme-in-project-view.png) ### 展示默认的 Jupyter 文件 和上面展示 `README.md` 的逻辑类似,容器在关闭后会自动查找 `/openbayes/home` 目录下的 `.ipynb` 文件,并将其内容展示在容器的页面中。 ![](/img/docs/show-jupyter-in-project-view.png) :::info 在容器关闭时,系统会按照 "index.ipynb", "main.ipynb", "default.ipynb" 的顺序在 `/openbayes/home` 根目录下查找文件,按顺序查找到的第一个文件将被显示在容器的页面中。如果以上文件都没有找到则在根目录随机获取一个 `.ipynb` 文件进行展示。 ::: ## 查看「工作目录」内容 如果需要查看「执行」的结果,可以通过两种方式查看: 1. 对于依然在运行的「Jupyter 工作空间」,可以直接在编辑器中查看或者下载,也可以在「容器页面」的「工作目录」选项卡查看,但是**「工作目录」选项卡的内容是周期性从运行中的「执行」里同步**的,因此运行中的「执行」其「工作目录」选项卡中的文件内容可能不是最新的数据 2. 对于「Python 脚本」则只能在「工作目录」选项卡查看,如果「执行」依然在运行注意其内容可能不是最新数据 ## 文件预览 容器的「工作目录」中的部分文件支持预览,其中支持的文件类型包括 `.txt` `.py` `.ipynb` `.csv` `.md` 以及多种图片类型。 Jupyter 文件的预览: ![](/img/docs/jupyter-view-in-job-output.png) Python 文件预览: ![](/img/docs/python-view-in-job-output.png) ## 下载文件 在「执行」关闭之后,「工作目录」选项卡中的数据为 `/openbayes/home` 目录中最终的数据内容,和「数据仓库」一样,可以通过页面进行浏览、预览以及下载操作。如下所示,点击「下载当前文件」可以将整个「工作目录」文件夹进行下载,当然也可以点击文件右侧按钮下载单个文件。 ![](/img/docs/gear-output-2.png) ## 将工作目录创建为数据仓库版本 目前容器支持将「工作目录」或者其中的一个文件夹创建为数据仓库的一个新的版本,这样就可以把「工作目录」中产生的模型或者清理后的数据单独管理起来,方便未来的使用。 ![](/img/docs/gear-output-3.png) ## 将工作目录作为数据绑定 已经关闭的「执行」的工作目录可以被绑定到新的「执行」之中: ![](/img/docs/gear-output-4.gif) --- ## 算力容器的执行记录 ## 为什么要有执行记录 容器每次执行都是**独立的运行环境**,这样的好处是保证每次容器的环境隔离,避免因为某一次环境出现的问题导致其他环境的破坏,这也是 OpenBayes 与我们直接在本地运行环境的一个优势。你可以认为每次开启的算力容器都是一个独立的沙箱,即使出现了问题再次开启新的环境即可。 同时,每次数据、模型、代码、参数都完全隔离可以最大程度上确保每次机器学习模型训练实验结果的独立性以及实验结果的可重复性,以便从大量训练模型中找到最优模型。 当然,这样也意味着每次新的容器里的额外的依赖都需要重新安装,具体安装外部依赖的内容可以在 [运行时环境](/docs/runtimes/) 找到。 在容器页面的「执行记录」选项卡就可以看到在当前容器下的所有执行记录了。 ![执行记录](/img/docs/gear-records-1.png) ## 执行记录的浏览与筛选 「执行记录」可以按照「状态」或者「类型」进行筛选: ![筛选状态与类型](/img/docs/gear-records-2.png) ## 从指定执行记录继续执行 ![继续执行](/img/docs/gear-records-3.png) 已经关闭的容器可以通过点击上图所示的「从此继续执行」再次开启,更过信息可以参见[「继续执行」](/docs/gear/#继续执行)。 ## 删除不再使用的执行记录 每个「执行记录」都有自己独立的「工作目录」以及「日志」,它们都占据了一定的存储空间。如果确认不再需要这个「执行记录」的「工作目录」以及「日志」了可以将其删除以释放其所占用的存储空间。 ![删除](/img/docs/gear-records-4.png) 点击上图中的「删除本次执行」即可删除其所绑定的「工作目录」以及「日志」内容。 :::caution 注意 任何删除行为都可能导致您再也无法恢复「工作目录」以及「日志」中的重要内容,请保证数据已经被下载后再清理执行记录 ::: 在「工作目录」选项卡下可以浏览和下载当前「执行记录」所生成的内容。 ![工作目录](/img/docs/gear-records-5.png) --- ## 远程连接运行中的 Jupyter import Media from '@site/src/components/Media'; 在 [通过 SSH 连接运行中的 Jupyter 执行](/docs/gear/ssh) 中介绍了通过 ssh 协议连接运行中的 Jupyter 的方法,除此之外 OpenBayes 中的 Jupyter 服务也可以直接通过 Jupyter Server 的 URL 直接连接。这样就可以让本地的 `.ipynb` 文件使用 OpenBayes 中的 Python 环境以及 GPU 资源了。 ## 在 VS Code 中远程连接 OpenBayes Jupyter Server 1. 需要安装 Jupyter 插件。 ![](/img/docs/install-jupyter-plugin-in-vs-code.png) 2. 打开「命令面板」选择「Jupyter: 指定本地或远程 Jupyter 服务器的连接」 ![](/img/docs/select-jupyter-server-in-vs-code.png) 3. 点选「现有的」: ![](/img/docs/select-existing-jupyter-server-in-vs-code.png) 4. 在运行中的容器页面点击「复制链接」拷贝 Jupyter Server 的链接。 ![](/img/docs/copy-jupyter-server-link-in-container-page.png) 5. 粘贴链接到之前的 VS Code 命令面板中的对话框,**需要删除容器 ID 后的部分,否则将链接不成功**,然后按照提示重新加载页面。 ![](/img/docs/copy-jupyter-server-link-into-vs-code.png) 获取的链接为: ``` https://openbayes.com/jobs/xushanchuan/jobs/iay6ih7xrgal/lab/tree/home ``` 需要删除 ID 之后的部分: ``` https://openbayes.com/jobs/xushanchuan/jobs/iay6ih7xrgal ``` 6. 在 VS Code 中创建 test.ipynb 文件,输入下图内容点击执行会提示选择内核,指向默认提示的内核即可。 ![](/img/docs/run-import-in-vs-code-via-remote-jupyter-server.png) ## 在 PyCharm 中远程连接 OpenBayes Jupyter Server ### 连接 Jupyter 服务器 1. 在本地创建一个 Python 项目,并在项目下创建一个 `test.ipynb` 文件。打开文件后点击顶部位置选择「Configure Jupyter Server...」。 ![](/img/docs/config-jupyter-server-in-pycharm.png) 2. 在弹出窗口中选择「Configured Server」并从运行中的容器页面点击「复制链接」拷贝到这里,**需要删除容器 ID 后的部分,否则将链接不成功**。 ![](/img/docs/copy-jupyter-server-url-to-pycharm.png) ![](/img/docs/copy-jupyter-server-link-in-container-page.png) 在上图获取的链接为: ``` https://openbayes.com/jobs/xushanchuan/jobs/iay6ih7xrgal/lab/tree/home ``` 需要删除 ID 之后的部分: ``` https://openbayes.com/jobs/xushanchuan/jobs/iay6ih7xrgal ``` 3. 创建新的代码块,测试是否链接成功。 ![](/img/docs/test-jupyter-server-in-pycharm.png) ### 支持自动补全 在实现 Jupyter 服务器的连接后发现其实没有任何的语法检查和自动补全。需要按照文档 [Configure an interpreter using SSH](https://www.jetbrains.com/help/pycharm/configuring-remote-interpreters-via-ssh.html) 添加 remote interpreter。上文的视频中有详细的步骤。 --- ## 使用 SSH Tunnel 访问容器的服务 import Media from '@site/src/components/Media'; :::info 提示 除了使用 SSH Tunnel,OpenBayes 还提供了更便捷的[自定义端口映射功能](/docs/gear/expose-service),可以直接将容器内的服务暴露到公网。 **选择指南:** - **SSH Tunnel**:适合个人临时访问,无需实名认证,只有建立隧道的本机可访问服务 - **端口映射**:适合需要持续提供服务给多个用户访问的场景,需要实名认证 本文档中的 Gradio 示例也可以通过端口映射方式实现,详见[自定义端口映射文档](/docs/gear/expose-service#部署-gradio-应用)。 ::: SSH Tunnel 是一种通过加密 SSH 连接来转发本地或远程计算机上的网络连接的方法。您可以使用 SSH Tunnel 来访问远程服务器上被防火墙保护的服务,而无需直接将端口暴露在公共互联网上。 有两种通过 SSH 访问机器的验证方式: 1. 基于密码的验证:这种方式需要用户输入密码进行身份验证。 2. 基于公钥的验证:这种方式使用公钥加密技术进行身份验证。它涉及在客户端生成一对密钥(公钥和私钥),并将公钥添加到 OpenBayes。私钥被安全地保存在本地机器上,并用于在不需要密码的情况下进行身份验证。 ## 使用密码 OpenBayes 的 SSH 服务默认提供了密码登录的方式,如果不想配置密钥也可以按照 [使用密码访问 SSH](/docs/gear/ssh/#使用密码) 的方式。 ## 配置 ssh key 如果您已经有 SSH 密钥,则可以跳过此步骤。相关的信息请在 [准备公钥](/docs/gear/ssh#准备公钥) 查看。 ## 如何使用命令访问端口 ### 1. 启动一个 openbayes 的工作空间 ![](/img/docs/workspace-example-for-ssh-tunnel.png) 复制「SSH 访问」面板中的命令到自己电脑的终端,确认是否可以成功的访问到容器。如果看到如下的内容说明已经成功访问到容器了。 ```bash $ ssh root@ssh.openbayes.com -p31552 Last login: Fri May 5 03:47:16 2023 from 10.110.14.192 OpenBayes 目录说明 - /openbayes/home 工作空间内的数据保存地址,容器停止后,该目录中的内容不会被删除 - /openbayes/input/input0 - /openbayes/input/input4 为数据集绑定地址,此地址为只读权限,不会占用工作空间的存储容量,最多支持同时绑定 5 个 ⚠️ 其他目录下的内容在容器关闭后会被自动删除!更多信息请访问 https://openbayes.com/docs/concepts 使用命令行工具 通过命令 bayes gear init 可以初始化容器中的命令行工具,更多信息见 https://openbayes.com/docs/cli/ (base) root@xushanchuan-fb075g25qn2k-main:/openbayes/home# ``` ### 2. 在容器中启动一个 gradio 的服务 首先在「工作空间」中打开一个终端,安装 gradio 的依赖: ```bash $ pip install gradio --user ``` 然后创建一个 `app.py` 文件,内容如下: ```python import gradio as gr def greet(name): return "Hello " + name + "!!" demo = gr.Interface(fn=greet, inputs="text", outputs="text") demo.launch() ``` 最后运行 `python app.py` 启动服务,可以看到如下的输出: ```bash $ python app.py Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. ``` 可以看到服务已经成功启动,访问地址为 `http://127.0.0.1:7860`。 ### 3. 通过 ssh tunnel 访问远程端口 使用以下命令启动 ssh tunnel: ```bash $ ssh -N -L localhost:7860:localhost:7860 root@ssh.openbayes.com -p31552 ``` 其中 `root@ssh.openbayes.com -p31552` 要保持和「SSH 访问」面板中看到的一致。 然后就可以在本地访问 `http://localhost:7860` 获取到服务了: ![](/img/docs/gradio-hello-world.png) ## 视频演示 视频演示没有声音,请结合上述内容观看该视频演示。 --- ## 通过 SSH 连接运行中的 Jupyter 工作空间 import Media from '@site/src/components/Media'; ## 功能介绍 OpenBayes 支持通过 SSH 协议来访问运行中的 Jupyter 类型的执行。有两种通过 SSH 访问机器的验证方式: 1. 基于密码的验证:这种方式需要用户输入密码进行身份验证。 2. 基于公钥的验证:这种方式使用公钥加密技术进行身份验证。它涉及在客户端生成一对密钥(公钥和私钥),并将公钥添加到 OpenBayes。私钥被安全地保存在本地机器上,并用于在不需要密码的情况下进行身份验证。 :::caution 注意 只有运行中的「Jupyter 工作空间」才能通过 SSH 协议访问。 ::: ## 使用密码 在工作空间创建成功后,页面会出现 ssh 登录相关的信息,也会为该容器创建一个密码,通过该密码可以完成 SSH 的身份验证,无需其他步骤。 ![](/img/docs/running-workspace-view.png) 如上图所示,点击「复制密码」即可。 ## 使用公钥 通过完成以下步骤就可以实现 SSH 访问了: 1. 向 OpenBayes 上传个人的 SSH 公钥 2. 在本地增加 OpenBayes SSH 访问的配置 3. 通过命令 `ssh root@xxx -pxxxx` 实现 SSH 登录 ### 准备公钥 打开命令行输入 `ssh-keygen -m PEM -t rsa -b 4096 -C "your.email@example.com"` (自己的邮箱) ,连续点击 Enter 即可生成一个密钥对。Windows 用户推荐采用 PowerShell 进行这步操作。 ```bash ssh-keygen -t rsa -b 4096 -C "your.email@example.com" # Creates a new ssh key, using the provided email as a label # Generating public/private rsa key pair. Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter] // 推荐使用默认地址 Enter passphrase (empty for no passphrase): //此处点击 Enter 键即可,也可以填写密码,填写密码后每次使用 SSH 方式推送代码时都会要求输入密码,由于这个 Key 也不是用于军事目的,所以也无需设置密码 ``` :::note 如果你对这部分非常了解可以按照常规创建公钥的流程即可,更多的信息可以参见 [生成 SSH 公钥](https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5)。 ::: 成功后显示如下信息: ```bash Your identification has been saved in /Users/you/.ssh/id_rsa. # Your public key has been saved in /Users/you/.ssh/id_rsa.pub. # The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your.email@example.com ``` ### 添加公钥 1. 打开 `~/.ssh` 目录(Windows 下为用户目录的 `.ssh` 目录),用编辑器打开 `id_rsa.pub` 文件(此处是生成公钥的默认名称,如果生成公钥时采用了其他名称,打开相对应的文件即可),复制全部内容。 2. 登录 OpenBayes 页面,在界面左侧导航栏点击「SSH 设置」->「添加新公钥」,将内容粘贴到「公钥」的文本框里并给自己的这个 SSH 公钥起个名字,点击添加 SSH 公钥即可。 ![](/img/docs/add-ssh.png) ### 使用 bayes CLI 管理 SSH 公钥 安装并登录 [bayes 命令行工具](/docs/cli/install/) 后,可通过 `bayes ssh` 子命令创建或上传公钥至 OpenBayes: ```bash # 创建并上传新的 SSH 公钥 bayes ssh create --name my-device # 上传已有的公钥文件 bayes ssh upload ~/.ssh/id_rsa.pub --name my-device ``` `--name` 选项用于为公钥指定一个易于识别的名称,不填则默认使用当前主机名。通过 CLI 上传的公钥会在所有工作空间中生效。 ### 手动追加公钥 如果暂时无法使用 CLI,可先使用密码登录到工作空间,然后在本地执行以下命令将公钥追加到当前工作空间: ```bash cat ~/.ssh/id_rsa.pub | ssh -p <端口号> root@ssh.openbayes.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' ``` 将 `<端口号>` 替换为工作空间页面中显示的端口。此方法只在当前运行的工作空间中生效,重启后需要重新追加。 ## 通过命令行登录 ### 1. 获取 ssh 登录信息 在启动「工作空间」后,其页面会展示 ssh 登录信息,如下图所示: ![](/img/docs/ssh-info-in-jupyter-workspace-page.png) 点击「复制命令」即可将命令拷贝到剪贴板,其命令行展示如下: ```bash ssh root@ssh.openbayes.com -p30360 ``` 其中 `root` 为用户名,`ssh.openbayes.com` 为服务器地址,可能是 IP 也可能是 openbayes 所指定的其他域名,`30360` 为端口号。 ### 2. 登录运行的 Jupyter 工作空间 将上述命令粘贴到命令行或按照上面的信息填写到其他支持 ssh 的客户端中即可实现通过 ssh 登录运行的 Jupyter 工作空间。 ![](/img/docs/ssh-connect-with-terminal.png) 如果你没有上传本地的公钥,则在这个步骤需要粘贴 SSH 的登录密码。 ### 3. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 如果将 `ssh` 登录命令粘贴到命令行中展示如上的报错,那需要做一个额外的步骤解决这个冲突。 在命令行下输入如下信息: ```bash ssh-keygen -R [ssh.openbayes.com]:<你的工作空间的端口> ``` 然后再次粘贴从「工作空间」复制的 `ssh` 命令即可。 ## 通过 VS Code SSH 连接 如果是通过 SSH 远程连接运行中的 Jupyter 环境,首先请阅读 VS Code 相关文档 [Remote Development using SSH](https://code.visualstudio.com/docs/remote/ssh) 了解 VS Code 对这方面的支持。并安装相应的插件。 ### 1. 安装 VS Code SSH 插件 ![](/img/docs/vscode-remote-ssh-plugin.png) 安装如上插件。 ### 2. 在 VS Code 中配置 ssh 连接 点击左下角,打开远程窗口。 ![](/img/docs/open-remote-command-in-vs-code.png) 在命令面板选择「Connect to Host...」并回车。在下拉框滚动到最底部,看到「Add New SSH Host..」,点击即可添加新的 SSH 连接。 ![](/img/docs/connect-to-host-in-vs-code.png) 输入完整的 ssh 命令,点击回车后使用默认的 ssh 配置文件,无需修改。 ![](/img/docs/input-ssh-info-in-vscode.png) 再次点击 vscode 左下角的远程窗口,点击「Connect to Host...」,选择已经配置好的 SSH 连接,点击「Connect」即可连接。 ### 3. 修改默认的访问目录 VS Code 会弹出一个新的窗口并提示连接成功了。目前其所指向的目录为 `/root` 而不是 OpenBayes 所默认使用的工作目录,点击左侧栏目中「打开文件夹」切换到 `/openbayes/home` 就可以看到目录中的内容了。 ![](/img/docs/vs-code-switch-directory-to-workdir.png) ### 4. 安装额外插件以支持 Jupyter 文件的执行 在 ssh 远程登录的情况下,如果你需要在容器内执行 `.ipynb` 文件,需要安装相应的插件。 新建文件 `main.ipynb` 双击后在页面的右上角会显示 `Select Kernel` 点击后会要求安装插件: ![](/img/docs/install-kernel-in-vscode.png) 按照提示,点击「Install in SSH...」。 ![](/img/docs/install-jupyter-in-ssh.png) 安装完成后回到刚才的 `main.ipynb` 页面,发现右上角已经选择了默认的 `kernel` 了,并且可以执行 python 命令了。 ![](/img/docs/run-jupyter-cell-in-vs-code.png) --- ## 算力容器存储持久化说明 OpenBayes 提供多种计算环境方案,本文主要介绍传统容器模式下的数据持久化机制。在这种模式下,容器在重启后,部分存储内容会保留,而部分会丢失。本文详细说明了哪些数据会保留,哪些会丢失,以及如何有效管理容器中的数据。 :::info 平台技术演进 OpenBayes 正在不断发展,除了本文介绍的传统容器模式外,平台还在积极开发「有状态容器」和「虚拟机」等新技术方案,这些方案将提供更灵活的数据持久化选项。本文内容主要适用于目前广泛使用的传统容器模式。 ::: ## 基本原理 ### 为什么数据会丢失? 传统容器被设计为"无状态"和"可重复"的环境,这意味着: 1. **隔离性**:每次启动容器时,它都是全新的、干净的环境,不受之前操作的影响 2. **一致性**:每个人启动相同配置的容器时,得到的是完全相同的初始环境 3. **安全性**:每次重启都会清除潜在的错误、冲突或安全问题 这种设计使得传统容器特别适合科学计算和机器学习工作,因为它确保了实验的可重复性和环境的一致性。 ### 为什么要这样设计? 这种设计有几个重要优势: 1. **可靠性**:避免「只能在我的环境运行」的问题 2. **可扩展性**:容器可以在任何支持相同容器技术的机器上运行 3. **资源效率**:多个容器可以共享底层资源,但彼此隔离 4. **快速部署**:可以迅速创建新环境而不影响其他工作 ### OpenBayes 的技术方案演进 随着用户需求的多样化,OpenBayes 正在拓展多种计算环境方案: 1. **传统容器模式**(本文重点):提供隔离、一致的环境,特定目录持久化 2. **有状态容器**(即将推出):提供更完整的状态保存,安装的软件和配置可以持久化 3. **虚拟机方案**(开发中):提供完全隔离的环境和全磁盘持久化,类似于物理机体验 不同方案各有优势,用户可以根据自己的需求选择最合适的方案: - 对实验可重复性要求高的场景,传统容器是理想选择 - 需要保留复杂环境配置的场景,有状态容器会更加方便 - 需要完全控制和自定义系统的场景,虚拟机方案更为适合 ### 丰富的预置镜像库 为了减少用户自定义安装复杂依赖的需求,OpenBayes 提供了大量精心准备的预置镜像: - **多版本深度学习框架**:包括 PyTorch、PaddlePaddle 等主流框架的多个版本 - **专业领域镜像**:针对计算机视觉、自然语言处理、强化学习等特定领域优化的环境 - **常用工具集成**:预装了数据科学常用的库和工具,如 NumPy、Pandas、Scikit-learn 等 - **GPU 加速支持**:多种 CUDA 版本和相应的深度学习框架 这些预置镜像经过专业团队精心配置和测试,确保各组件之间的兼容性和稳定性,大大降低了用户环境配置的复杂度。用户可以直接选择最接近自己需求的镜像,而无需从头开始安装和配置复杂的依赖。 :::info 选择合适的镜像 在创建容器时,建议仔细查看可用镜像列表及其详细说明,选择最符合项目需求的预置环境。这样可以最大限度减少额外安装依赖的需求,提高工作效率。 ::: ### 持久化存储的解决方案 在传统容器模式下,OpenBayes 提供了专门的持久化目录(`/openbayes/home`)和数据仓库功能。这就像是在一次性工作室中提供了一个特殊的保险柜,您放在保险柜里的东西不会随工作室的重置而消失。 这种设计平衡了环境隔离的优势和数据持久化的需求,让您既能享受容器的便利,又不必担心重要数据的丢失。 :::info 数据管理相关资源 - 了解如何上传数据到 OpenBayes 平台,请参考[数据上传指南](/docs/data-warehouse/data-upload) - 了解如何将数据绑定到容器,请参考[数据绑定指南](/docs/gear/databinding) ::: ## 会丢失的存储内容 1. **系统盘(根目录 `/` 下的内容)** - 容器关闭后,系统盘上的所有数据都会被清除 - 这包括根目录及其下的所有子目录(除了特定的持久化目录) - 通过 `apt` 安装的系统依赖会在容器重启后丢失 - 默认情况下,通过 `pip` 安装的 Python 依赖也会丢失(除非使用 `--user` 参数) 2. **环境设置和配置** - 每次容器的「执行」环境都是隔离的 - 所有手动安装的软件、依赖包在容器关闭后无法找回 - 即使通过「继续执行」运行容器,也是一次全新的环境 3. **临时文件和缓存** - 容器内产生的临时文件、日志文件(非工作目录下) - 内存中的数据(如运行中的变量、模型状态等) ## 不会丢失的存储内容 1. **工作目录(`/openbayes/home`)** - 所有保存在此目录下的数据会在容器关闭后自动保存 - 这些数据会被同步到用户的全局存储空间并占用相应的存储配额 - 下次启动容器时,可以通过数据绑定继续使用这些数据 2. **特定的 pip 依赖** - 如果使用 `pip install --user xxx` 命令安装依赖,这些依赖会被保存在 `/openbayes/home/.pylibs` 目录下 - 这些依赖在容器重启后依然可用 3. **自定义 Conda 环境** - 如果在 `/openbayes/home` 目录下创建自定义的 Conda 环境,这些环境在容器重启后仍然可用 4. **数据仓库中的数据** - 通过数据仓库(数据集、模型)绑定到容器的数据不会丢失 - 绑定到 `/openbayes/input/input0-4` 目录的数据可以在不同容器间共享使用 - 关于如何绑定数据仓库中的数据,请参考[数据绑定指南](/docs/gear/databinding) ## 最佳实践建议 1. **所有需要持久保存的数据**务必存放在 `/openbayes/home` 目录下 2. 对于不需要修改但需要经常使用的大型数据集,建议创建为数据仓库并绑定到 `/openbayes/input/input0-4` 目录([了解如何绑定数据](/docs/gear/databinding)) 3. 对于经常使用的依赖包,可以: - 使用 `pip install --user xxx` 安装到用户目录 - 在 `/openbayes/home` 下创建自定义独立环境(内置 Conda 的运行时见[用 Conda 进行依赖管理](/docs/gear/conda),uv 运行时见[用 uv 管理 Python 环境](/docs/gear/uv)) - 在代码仓库中包含 `requirements.txt`/`conda-packages.txt` 文件 4. 将系统依赖的安装命令保存在 `dependencies.sh` 脚本中,以便每次容器启动时自动安装 5. 定期清理不必要的数据,避免存储空间不足 6. 对于需要长期保存或在多个容器间共享的大型数据集,建议[上传到数据仓库](/docs/data-warehouse/data-upload)并通过数据绑定使用 :::info 选择合适的技术方案 如果您发现自己频繁需要安装相同的系统依赖,或者需要复杂的环境配置,可以考虑使用OpenBayes即将推出的「有状态容器」或「虚拟机」方案,这些方案提供更持久的环境保存能力。 ::: 通过合理利用这些持久化机制,可以有效管理容器重启后的数据存储,减少重复工作,提高开发效率。 --- ## 使用 TensorBoard 为了更方便 TensorFlow 程序的理解、调试与优化,TensorFlow 团队发布了一套名为 [TensorBoard](http://www.tensorfly.cn/tfdoc/how_tos/summaries_and_tensorboard.html) 的可视化工具。可以用 TensorBoard 来展现 TensorFlow 图,绘制图像生成的定量指标图以及显示附加数据(如其中传递的图像)。 目前 OpenBayes 容器在创建 Task 或 Jupyter 工作空间时都已经支持了 TensorBoard。 以下的代码示例展示了如果在训练时指定使用 TensorBoard: ```py def create_model(): model = tf.keras.models.Sequential([ tf.keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(img_rows * img_cols,)), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(num_classes, activation=tf.nn.softmax) ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) return model model = create_model() model.summary() log_path = './tf_dir' # 设置 TensorBoard 路径到 tf_dir tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_path) model.fit(x_train, y_train, epochs=epochs, verbose=1, callbacks=[tb_callback]) ``` 完整的代码见 [MNist Example](https://github.com/signcl/openbayes-mnist-example)。 :::caution 注意 如下图所示,我们默认指定 TensorBoard 数据获取的目录为 `/openbayes/home` 下的 `tf_dir` 文件夹。因此如果您需要展示 TensorBoard 数据,请务必将 `TensorBoard` 的 `log_dir` 设置为该目录。 ::: ![](/img/docs/gear-tensorboard-1.png) 对于运行成功的容器,其页面上会出现 "打开 TensorBoard" 的按钮,打开就可以看到正在运行的 TensorBoard 了。 ![](/img/docs/15514372525492.jpg) 容器只有在运行的状态下才能查看 TensorBoard,如果您想在容器停止后依然查看 TensorBoard,请将 "工作目录" 下载到本地,并通过在本地安装 TensorBoard 来查看其中的内容: ``` tensorboard --logdir= ``` 然后在浏览器打开 [http://localhost:6006/](http://localhost:6006) 即可。 --- ## 用 uv 管理 Python 环境 :::info 这里介绍的是用 uv 创建一个完全独立的 Python 环境,通常意味着你需要一个与运行时自带的 Python 不同版本的环境,或者想为某个项目完全隔离依赖。如果只是想安装几个额外的包,不需要创建独立环境——`pip install --user ` 即可,安装的包会保存在工作空间中,重启后依然可用,可以参考文档 [保留 pip 依赖](/docs/runtimes#保留-pip-依赖)。 ::: 较新的 Ubuntu 24.04 运行时(如 `vllm 0.20` 及之后、`pytorch 2.11` 及之后)使用 [uv](https://docs.astral.sh/uv/) 管理 Python,不再内置 Conda。运行时自带的默认 Python 环境位于 `/opt/venv`。 :::caution 直接用 `uv pip install <包名>` 会把包装进自带的 `/opt/venv`,可以立即使用,但该目录不在持久化目录下,容器重启后会丢失。需要重启后保留时:只装少量包用 [`pip install --user`](/docs/runtimes#保留-pip-依赖)(uv 不支持 `--user`,这一步用系统自带的 `pip`);需要独立环境则按下文在 `/openbayes/home` 下创建。 ::: 判断当前运行时使用的是 uv 还是 Conda: ```bash $ uv --version # 能输出版本号即为 uv 运行时,使用本文 $ conda --version # 能输出版本号即为 Conda 运行时,参考「用 Conda 进行依赖管理」 ``` ## 使用 uv 创建新的环境 ### 1. 在 `/openbayes/home` 下创建一个新的环境 ```bash cd /openbayes/home uv venv myenv ``` 通常几秒钟即可完成。然后激活新的环境: ```bash source /openbayes/home/myenv/bin/activate ``` :::note 能够保存环境的关键在于将环境创建在 /openbayes/home 下。容器重启后,重新执行上面的 source 命令即可继续使用这个环境。 ::: ### 2. 在环境中安装依赖 激活环境后使用 `uv pip install` 安装依赖: ```bash uv pip install torch torchvision uv pip install -r requirements.txt ``` :::info 在自建的独立环境中安装依赖时**不要**添加 `--user` 参数;添加 `--user` 后依赖会被安装到 `/openbayes/home/.pylibs` 下而不是新创建的环境中,容易引发依赖冲突。 ::: ### 3. 需要不同的 Python 版本 uv 可以下载任意版本的 Python,但请务必先把下载位置指定到工作空间内,否则容器重启后解释器会丢失、整个环境失效: ```bash export UV_PYTHON_INSTALL_DIR=/openbayes/home/.uv/python uv venv myenv --python 3.11 ``` :::caution `export` 设置的环境变量只对当前终端会话有效。之后(包括容器重启后)再创建其他 Python 版本的环境时,请先重新执行上面的 export 命令——遗漏的话,新创建的环境会在下一次重启后失效。 已经创建好的环境不受影响:解释器已保存在工作空间内,重启后直接 `source` 激活即可继续使用。 ::: 使用运行时自带的 Python 版本创建环境时(不指定 `--python` 或与自带版本一致),无需设置该变量。 ## 将新创建的环境与 Jupyter 工作空间集成 与 Conda 环境类似,在环境中安装 ipykernel 并注册为 Jupyter kernel,即可在同一个 Jupyter 工作空间中切换使用不同的环境: ```bash source /openbayes/home/myenv/bin/activate uv pip install ipykernel python -m ipykernel install --user --name=myenv --display-name="Python (myenv)" ``` **重新打开 Jupyter 工作空间页面后**即可在 kernel 列表中看到新增的选项。 :::note kernel 的注册信息保存在系统目录中,容器重启后会丢失。重启后重新执行上面最后一条 `python -m ipykernel install` 命令即可恢复(环境本身保存在工作空间中,不会丢失)。 ::: --- ## Jupyter 工作空间 「Jupyter 工作空间」(后面也会直接称为「工作空间」)是 OpenBayes 提供的交互式开发环境。本质上,它是 `Job(mode=WORKSPACE)` 的一种运行形态: - 提供了 JupyterLab 为入口的交互式环境,易于使用的界面适合各种数据科学和机器学习任务。 - 运行中的工作空间也支持通过 SSH 连接,便于远程开发。 - 支持「重启」功能,便于恢复之前的工作状态而不会创建新的执行实例,避免存储空间重复占用问题。 - 每次启动都会自动绑定之前的「工作目录」内容,并允许按当前执行类型与配置约束调整算力、数据绑定等设置。 ## 基本界面 在单次执行的页面点击「打开 Jupyter 工作空间」进入如下的界面: ![](/img/docs/gear-workspace-1.png) 其中右侧的侧边栏展示了当前执行的一些基本信息,包括[系统指标](/docs/gear/metrics/#展示关键的-metrics)、执行的基本信息(算力类型、运行环境、运行时间)以及设置界面。其中通过系统指标可以了解到当前执行是否在有效的利用系统所提供的计算资源。在执行打开后也会默认弹出 `openbayes-intro.ipynb` 文件包含了 OpenBayes Jupyter 工作空间的一些基本介绍。 虽然在 JupyterLab 页面的左侧文件导航栏的头部显示的目录为 `/home`,但这并不是系统中的 `/home` 目录,而是 JupyterLab 相对其根目录展示出来的路径。OpenBayes 将 JupyterLab 的根目录设置为 `/openbayes`,因此当你在 JupyterLab 中看到 `/home` 时,实际对应的是系统里的 `/openbayes/home`。 左侧文件导航栏无法展示 `/openbayes` 以外的目录内容。如果需要保存其他目录中的文件,请通过 JupyterLab 的 Terminal 命令行将其拷贝到 `/openbayes/home` 目录。 ## 工作空间里的目录如何理解 在工作空间里,下面几组路径最容易让新用户混淆: - JupyterLab 里看到的 `/home` - 容器里的 `/openbayes/home` - 创建 Job 时常写的 `/output` - 数据绑定里常见的 `/input0` ~ `/input4` - 容器里的 `/openbayes/input/input0` ~ `/openbayes/input/input4` 它们的对应关系可以直接记成: - JupyterLab 里的 `/home`,实际对应容器里的 `/openbayes/home` - `/output` 等价于 `/openbayes/home` - `/input0` 等价于 `/openbayes/input/input0` - `/input1` 等价于 `/openbayes/input/input1` - `/input2` 等价于 `/openbayes/input/input2` - `/input3` 等价于 `/openbayes/input/input3` - `/input4` 等价于 `/openbayes/input/input4` 可以把它理解为两类目录: - `/output` / `/openbayes/home`:当前工作空间自己的工作目录,适合保存代码、Notebook、模型、结果文件 - `/input*` / `/openbayes/input/input*`:绑定进来的输入目录,适合读取数据集、预训练模型、其他 Job 的输出 一个最常见的用法是: ```text 从 /input0 读取训练数据 从 /input1 读取预训练模型 在 /output 保存代码修改、checkpoint 和最终产物 ``` 如果你只是消费大数据集,通常建议把它们挂到 `/input*`,而不是拷贝进 `/output`。这样更容易保持工作目录清晰,也能减少后续重启时需要同步的数据量。 ## Jupyter 工作空间的创建 创建工作空间的流程如下,在选择「接入方式」时,选择「Jupyter 工作空间」: ![](/img/docs/gear-workspace-2.png) :::note 在创建执行时的「数据绑定」阶段,工作空间可以进行数据绑定,文档见[「数据绑定」](/docs/gear/databinding/)。 ::: 执行启动后,其界面如下: ![](/img/docs/gear-workspace-3.png) ![](/img/docs/gear-workspace-4.png) ## 执行长时间训练 机器学习尤其是深度学习的训练任务通常会需要比较长的运行时间,但是作为一个交互式的编程环境,工作空间并不非常适合这种场景。 **虽然在工作空间执行的程序即使关闭网页,程序依然会运行**,但是在工作空间下运行长时间的任务会有如下两个问题: 1. 长时间任务在运行时一旦网络出现波动会导致其运行的日志打印中断,导致无法查看到目前训练的进度 2. 长时间任务在 Jupyter 工作空间中执行时即使任务执行完毕了或者由于某些原因报错了,工作空间不会立即关闭,但是计费还在继续导致计算资源的浪费 因此如果需要执行长时间的训练任务,建议查看 [Task 与 Jupyter 工作空间结合](/docs/gear/#task-与-jupyter-工作空间两种模式结合使用)部分采用 task 执行长时间任务。不过这里依然提供两个对应的解决方案: ### 使用 Log Console 找到丢失的日志 这里通过一个简单的代码片段模拟一个长时间运行的任务: ```python import time for i in range(100000): print(i) time.sleep(1) ``` 将该段代码在一个 `.ipynb` 文件中执行看到如下的日志信息: ![](/img/docs/2020-02-05-18-51-41.png) 这个代码块会一直更新日志,但是如果我们刷新页面后再回来会发现日志不再更新了。这个时候在该代码块中右键点击「Show Log Console」打开当前的 Log Console 界面。 ![](/img/docs/2020-02-05-18-54-00.png) 然后选择 Debug 级别的日志就可以看到之前的日志进度了: ![](/img/docs/2020-02-05-18-55-13.png) ### 使用日志重定向保存日志到文件并配合 `tail` 命令查看最新的日志内容 对于通过 `Terminal` 执行的长任务,可以将日志重定向一个特定的文件,并通过 `tail -f` 的命令查看日志: ```sh # 将 python train.py 的输出重定向到 train.log 文件中 python train.py > train.log 2>&1 & # 通过 tail -f 命令查看 train.log 文件的内容 tail -f train.log ``` ## Jupyter 工作空间的自动关闭 由于「工作空间」在开启之后就开始计费了,为了减少因为忘记关闭而带来的计算资源的浪费。OpenBayes 默认为容器里添加了「工作空间」超时自动关闭的设置。 OpenBayes 会结合 JupyterLab 的活跃状态和系统资源使用情况来判断工作空间是否空闲,而不是只看某一个单独条件。 在「容器」的「设置」选项卡可以看到「JupyterLab 闲置自动关闭设置」,可以设置工作空间空闲多久后自动关闭,默认时长为 30 分钟。当系统判断工作空间进入空闲状态后,会先向创建者发送提醒;如果之后仍然保持空闲,系统会自动关闭该工作空间。有关通知方式可以在 [gear#设定通知](/docs/gear#设定通知) 中进行配置。 :::caution 注意 非常重要! 判断工作空间是否仍在被使用,会参考 JupyterLab 提供的活跃状态信息。我们不会记录用户的编辑内容。如果工作空间页面仍保持活跃,系统通常不会触发空闲关闭。 工作空间页面关闭不会导致已经在运行的程序出现中断,因此如果确实需要在工作空间中执行长任务,又希望程序运行完触发空闲关闭,可以直接关闭页面。 有的时候工作空间虽然没有关闭但是电脑自身锁定或者睡眠也会让 OpenBayes 认为容器是不活跃的了,但是这种情况和每个人的电脑设定有关,如果希望触发空闲关闭不浪费计算资源还是建议关闭页面。 ::: ![](/img/docs/gear-workspace-5.png) 当容器由于空闲时长而被自动关闭时,OpenBayes 会在容器的状态上显示「超时关闭」。 ## Jupyter Kernel 内核的重启 每次在 Jupyter 工作空间中打开一个 `.ipynb` 文件后系统会对应的创建一个名为 `kernel` 的后台负责执行在页面提交的代码。如果发现自己的 `.ipynb` 文件执行命令出现了问题,最简单的处理方法就是重启对应的 `kernel`: ![](/img/docs/2020-02-05-19-00-07.png) ## Jupyter 工作空间的重启 在工作空间关闭之后可以再次启动。目前工作空间支持两种模式的启动:「快速启动」和「修改配置并启动」。 ### 快速启动 点击页面上的「启动」进行快速启动,默认保留上一次执行的主要配置(算力、运行时环境、环境变量等),并自动绑定上一次运行时「工作目录」中的数据。其中 Secret 类型的环境变量会沿用上一次保存的真实值,无需重新输入。 ![](/img/docs/gear-workspace-6.png) ### 修改配置并启动 如果需要修改配置可以点击「启动」右侧的箭头: ![](/img/docs/gear-workspace-7.png) 之后可以按照流程修改算力、数据绑定、环境变量等信息;是否可以调整运行时环境(镜像)取决于当前工作空间类型与配置。环境变量中的 Secret 变量会以脱敏、只读的形式默认沿用,如需更换可点击该变量的「替换」输入新值。 关于环境变量的明文 / Secret 两种类型,以及克隆、修改类型等场景下的处置方式,详见[环境变量与 Secret 变量](/docs/gear/env-vars/)。 ## Jupyter 工作空间的高速缓存机制 - 每位用户可创建的工作空间个数不受限制,但我们为每位用户提供的可缓存的工作空间的个数是有限的 - 创建工作空间时,默认都会被高速缓存,被缓存的工作空间会在界面上额外显示一个闪电图标 - 当达到当前用户可保存的高速缓存上限后,会将旧的被缓存的工作空间降级为普通工作空间。被缓存工作空间降级时,总是会优先删除上次关闭时间距离现在最远的那个(最早的一个) - 被缓存的工作空间在关闭后有最大的缓存时间,超过这个时间后,即使没有创建新的工作空间,也会被降级为普通的工作空间 - 被缓存的工作空间在功能上与普通的工作空间没有任何区别,只是在启动速度上存在差异 ![](/img/docs/gear-workspace-8.png) ## 为工作空间建立快照 创建「快照」可以将当前工作空间的「工作目录」保存下来,作为一个固定的版本,以便在未来使用: ![](/img/docs/gear-workspace-10.png) 快照创建后依据「工作目录」规模大小需要一定的拷贝时间,工作空间「工作目录」越大,所需要拷贝的时间就越久。 ![](/img/docs/gear-workspace-11.png) 快照会记录工作空间所使用的「算力类型」「数据绑定」「镜像类别」,通过「继续执行」可以从这个快照启动新的「工作空间」,默认沿用快照所记录的以上配置并将快照的「工作目录」拷贝到新的工作空间的 /openbayes/home 目录下: ![](/img/docs/gear-workspace-12.png) 快照模式需要注意的几点: - 用户只有在工作空间处于「正在运行」和「已关闭」两种状态下可以创建快照 - 快照所占用的空间即为标准的存储空间费用,无额外的其他费用,将不再使用的快照删除将释放相应的存储空间 - 创建快照时尽量避免对运行中的工作空间执行文件写入 / 修改操作,以防生成的快照与期望内容不一致 --- ## 关键概念 这里介绍 OpenBayes 的核心概念,以及它们之间的关系。 ## 快速理解 OpenBayes OpenBayes 的日常使用可以抽象为 5 个核心概念: - 算力容器执行(`Job`):一次计算执行(训练、调试、运行服务) - 在线部署(`Serving`):对外提供在线服务 - 运行时环境(`Runtime`):镜像与执行环境 - 算力资源(`Resource`):CPU/GPU/内存/磁盘规格 - 数据资产(`Dataset`):可版本化的数据集资产 它们的关系可以理解为: - 算力容器执行(`Job`)与在线部署(`Serving`)是两个执行面(开发训练面、在线服务面) - 运行时环境(`Runtime`)与算力资源(`Resource`)是执行配置面 - 数据资产(`Dataset`)是可复用的数据资产面 ## 算力容器执行(Job) 在 OpenBayes 中,用户发起的一次计算执行统一抽象为 `Job`。 创建 Job 时,通常需要确定: - 运行模式(`mode`) - 运行时环境(`Runtime`) - 算力资源(`Resource`) - 数据绑定(`Dataset` 或其他产物) ### Job 的常见模式 - `WORKSPACE`:交互式工作空间(Jupyter) - `TASK`:脚本任务(适合长时训练) - `VIRTUAL_MACHINE`:虚拟机模式 - `BATCH_WORKSPACE` / `BATCH_TASK`:批量模式 其中,最常见的是前两种: - `WORKSPACE` 适合调试、探索与迭代 - `TASK` 适合稳定脚本的长时运行 ### Workspace 与 Jupyter/SSH `Workspace` 不是独立系统,而是 `Job(mode=WORKSPACE)` 的交互形态。 运行中的 Workspace 通常提供: - JupyterLab 入口 - SSH 连接能力(可用于远程开发) 你可以结合这两种方式完成调试与开发。 :::caution 注意 Workspace 运行中会持续占用算力并计费。完成调试后请及时关闭,避免不必要成本。 ::: ### Job 端口映射 Job 支持端口映射。你可以把容器内服务映射到外部地址(如 Web UI、推理调试接口等)。 在 Job 场景中,`8080` 是默认对外暴露的 HTTP 服务端口,通常不需要额外配置端口映射。页面中的「API 地址」对应的就是该 `8080` 服务入口。 常见限制: - 保留端口不可映射(如 22、8888 等) - 单个 Job 支持最多 5 个自定义端口映射 更多细节见:[自定义端口映射与服务暴露](/docs/gear/expose-service/)。 ## 在线部署(Serving) `Serving` 用于对外提供在线推理服务。 可以把它理解为“可版本化的在线服务对象”: - `Serving`:服务逻辑对象(名称、权限、链接、版本入口) - `ServingVersion`:具体运行版本(runtime/resource/dataBindings/replica) ### 对外访问 Serving 提供对外访问链接(如 HTTP / gRPC),用户可通过域名直接调用。 ### 访问控制(Bearer Token) Serving 支持访问控制开关: - 关闭时:按资源权限规则访问 - 开启后:请求需要携带 API Key 标准请求头格式: ```http Authorization: Bearer ``` 更多细节见:[API Key 管理](/docs/serving/api-key-management)。 ## 运行时环境(Runtime) `Runtime` 决定“在什么环境里跑”。 通常包含: - 框架(如 PyTorch / TensorFlow / vLLM) - 版本 - 设备类型(CPU/GPU) 同一份代码在不同 Runtime 下可能表现不同,因此 Runtime 是可复现性的关键要素。 更多细节见:[运行时环境](/docs/runtimes/)。 ## 算力资源(Resource) `Resource` 决定“用多少资源跑”。 通常包含: - CPU - GPU - 内存 - 磁盘 Resource 直接影响: - 任务速度 - 可承载模型规模 - 运行成本 更多细节见:[资源以及用量](/docs/quota-and-usage/)。 ## 数据资产(Dataset) `Dataset` 是可版本化的数据资产,核心价值是“可复用、可治理、可追踪”。 你可以把数据集版本绑定到 Job 或 Serving 中使用,从而避免重复上传与复制。 常见挂载目录: - `/openbayes/input/input0` - `/openbayes/input/input1` - `/openbayes/input/input2` - `/openbayes/input/input3` - `/openbayes/input/input4` ### DataBinding(数据绑定) 绑定时常见两类语义: - 只读绑定(推荐默认) - 读写绑定(用于数据整理与协作维护) 此外,`/openbayes/home` 是 Job 的工作目录,适合保存本次执行的产物。 更多细节见:[数据仓库](/docs/data-warehouse/) 与 [数据绑定](/docs/gear/databinding/)。 ## 推荐工作流 1. 用 `Workspace(Job)` 做交互式开发与调试(Jupyter/SSH) 2. 用 `Task` 或批量模式执行稳定训练任务 3. 基于训练产物或数据仓库创建 `Serving` 4. 按需开启访问控制,使用 `Bearer API Key` 对外提供服务 ## 进一步阅读 - [算力容器介绍](/docs/gear/) - [Jupyter 工作空间](/docs/gear/workspace/) - [通过 SSH 连接运行中的 Jupyter 工作空间](/docs/gear/ssh/) - [模型部署介绍](/docs/serving/) - [API Key 管理](/docs/serving/api-key-management) --- ## FAQ(常见问题解答) ## 如何收费? 在新建算力容器页面,可查看**全部算力类型的具体配置及价格**,并进行**余额充值**。 ![价格](/img/docs/FAQ-1.gif) ## RTX 3090 及 A100 分别采用哪种 CPU? - RTX 3090 采用 AMD EPYC™ 7003 系列中最强 CPU 7773X,128 核心,主频高达 3.5GHz - A100 算力配有 80 GB 超大显存,CPU 则采用 Intel® Xeon® Gold 6348,56 核心 ## OpenBayes 平台机器系统版本及外网带宽分别是怎样的? 我们的系统是 **Ubuntu 18 LTS**,您可以在容器中通过 `lsb_release -a` 查看 从本地上传至 OpenBayes 以及从 OpenBayes 下载文件至本地电脑,均为 300 Mbps 带宽,上传慢通常受限于用户带宽不够。在 OpenBayes 容器内安装依赖(如从 Hugging Face 下载模型),带宽为 50 Mbps ## 「工作空间」与「存储空间」有何区别? - **工作空间:** 算力容器的本地磁盘(如 RTX 3090 工作空间为 50 GB),用户可以上传代码、文件、数据集(不超过最大容量)等,**容器关闭后上传的内容消失。** 如希望容器关闭后保存内容,需将内容保存在特定目录 `/openbayes/home/` 中,这样关闭容器后可自动同步至存储空间 - **存储空间:** 用于保存用户上传的数据集、模型、容器的工作目录等,可以一直保留,平台目前为每位用户提供 50 GB 永久免费的存储空间,可以通过删除执行记录、数据集、模型等行为,释放存储空间。存储空间溢出后容器不会停止运行,但是会影响下次启动新容器。 ## 如何扩容存储空间? 这个问题需要分情况讨论: ### 1. 通过数据仓库扩展可用存储空间 由于目前「工作空间」容量固定(比如 RTX 3090 的 50GB 工作空间),您可以通过以下方式来管理更大的数据: 1. 创建一个数据仓库(数据集或模型) 2. 在创建容器时将该数据仓库以「读写绑定」的方式绑定到 `/openbayes/input/input0`(或其他 input 目录) 3. 直接将数据写入到绑定的目录中,这样数据会直接存储在数据仓库中,而不占用工作空间 这种方式特别适合: - 需要处理超过工作空间容量限制的大型数据集 - 需要在多个容器之间共享数据 - 需要长期保存的重要数据 ### 2. 扩容永久存储空间 平台为每位注册用户赠送**永久有效的 50 GB 存储空间**,用于存储: - 用户上传的数据集 - 模型文件 - 容器工作目录中的数据(`/openbayes/home` 目录) 当免费的 50GB 存储空间不够用时,您需要进行扩容,否则将无法正常启动算力容器。扩容方式如下: ![订阅储存空间](/img/docs/FAQ-2.gif) :::info 管理建议 - 定期清理不再需要的数据和执行记录 - 将重要数据整理到数据仓库中统一管理 - 及时删除临时文件和中间结果 ::: ## 如何保存虚拟环境、避免重复安装? OpenBayes 支持虚拟环境保存及更改 Python 脚本,可以参照 **[运行时环境(镜像)概览](https://openbayes.com/docs/runtimes)** ## 如何保存我已经安装的依赖而不必每次重启都重复安装? 有以下两种方式可以保存你的依赖: 1. 在默认的 conda 环境中使用 `pip install --user xxx` 命令安装依赖,这样安装的依赖会保存在用户目录下,不会因为重启而丢失。 2. 创建自定义的 conda 环境,并将该环境放置在用户目录下(`/openbayes/home`),更多的信息可以见[用 Conda 进行依赖管理](/docs/gear/conda)。 但是对于通过 `apt` 安装的依赖无法保存,需要启动时重新安装。 ## 如果余额不足,我正在运行的容器会怎样? 如果账户余额不足,正在运行的容器会被强制关闭,建议您随时关注容器运行状况,保证账户余额充足。 ## 如果账号欠费,我的数据会怎样? 如果您的账号自欠费之日起,在三个月内没有执行续费操作,您账号上超过免费额度部分的内容将被删除,直至账号内的资源占用情况满足免费额度所需要的条件。 ## 如何查看资源有效期? 您可在控制台的 **资源使用状况 - 资源变更详情** 中进行查看 ## 如何开发票? 我们提供自助开发票的功能: ![](/img/docs/create-fapiao-request.gif) 为避免重复开票,充值记录和从支付宝等直接消费的记录允许开发票,**从余额消费的订单无法开发票。** **平台发票每周五统一开出。** 周五 15:00 前提交申请,当天开具发票;15:00 后提交申请,下周五开具发票。 :::caution 目前开取发票的最低额度为 500 元,请确认需要开票的金额达到了 500 元以上,请理解。 ::: ## 为什么文件上传失败了? 文件上传失败通常由以下几个因素导致: 1. **网络不稳定** - 上传大文件时需要稳定的网络连接,任何中断都可能导致上传失败。电脑进入休眠状态会导致网络连接中断,从而使上传失败。 2. **浏览器限制** - 通过浏览器上传特别大的文件可能会受到浏览器本身的限制 3. **存储空间不足** - 如果您的存储空间已满,文件将无法上传成功 ### 解决方案 1. **利用断点续传功能** OpenBayes支持断点续传功能,无论是通过网页上传还是命令行工具上传。即使上传失败也不必太担心,系统会记住已上传的部分。只要文件内容和上传目标位置保持不变,再次上传时会自动从断点处继续,不会从0开始重新上传,从而大大节省您的时间和带宽。 2. **使用命令行工具上传** 对于特别大的文件,推荐使用命令行工具上传,稳定性更高。OpenBayes提供的命令行工具可以更稳定地上传大文件: ```bash bayes data upload <数据集ID> -v <版本号> -p ``` 更多详细信息请参考[用bayes上传数据](/docs/cli/upload-dataset/)文档。 3. **尝试其他上传方式** 如果通过Jupyter工作空间上传失败,可以尝试使用数据仓库或命令行工具上传。详细可参考[数据上传方式](/docs/data-warehouse/data-upload/)。 4. **利用.openbayesignore过滤不必要文件** 创建`.openbayesignore`文件可以排除不需要上传的文件,类似于`.gitignore`的作用。 5. **检查存储空间** 确保您的账户存储空间有足够容量。如果存储空间不足,您可以参考[如何扩容存储空间](#如何扩容存储空间)部分了解解决方案。 :::warning **注意事项**:上传文件期间,请确保您的电脑不会进入休眠状态。电脑休眠会导致网络连接中断,从而使上传失败。如果您需要上传大文件,建议调整电脑的电源设置,延长或禁用休眠时间。 ::: ## 是否可以私有部署? 我们目前提供私有部署方案,请通过 [私有部署](/enterprise/) 页面与我们联系,并告知我们您具体的需求。 ## 无法收到验证短信? 根据短信运营商的反馈,请先进行排查: - 手机是不是长时间不关机,可以关机重启下手机收件箱是不是已满 - 删除一些看是否可以正常接收手机是不是双卡双待的手机,把卡拿出来换一下卡槽手机 - 是不是安装了安全软件,安全软件有可能会进行拦截到垃圾信箱里 - 如若不行,请您将 SIM 卡换到其他手机上进行测试 如果依然无法收到验证短信,请 [联系客服](/support) 进行解决 --- ## 快速上手 这里介绍通过 OpenBayes 快速开启 Jupyter 工作空间。 ## 注册用户 首先,请登录 [openbayes.com/console](https://openbayes.com/console) 注册 OpenBayes。 ![注册](/img/docs/getting-started-1.png) 成功注册后看到界面如下: ![进入](/img/docs/getting-started-2.png) 其中 **算力容器** 为我们目前的主要服务,提供了包含 **Jupyter 工作空间** 和 **脚本上传** 两种算力使用方式。 * **Jupyter 工作空间** 是交互式编程环境,方便早期模型的尝试 * **脚本上传** 则是指将指定代码上传和执行,适合运行时间比较长的模型训练 而 **数据仓库** 负责管理用户用于模型训练的数据以及其他类型的数据存储。 ## 创建 Jupyter 工作空间 :::info 如果你还不知道如何使用 JupyterLab,可以参考我们的 [Jupyter 工作空间](/docs/gear/workspace) 文档、[JupyterLab 官方文档](https://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html) 或相关的[中文翻译资料](https://zhuanlan.zhihu.com/p/33898478)。 ::: 在 [openbayes.com/console](https://openbayes.com/console) 左侧「模型训练」处,点击 「+」 创建新容器 : ![新模型](/img/docs/getting-started-3.png) 1. 选择所需算力 2. 选择[计费方式](/docs/payment-methods) 3. 选择镜像,内置多个版本,详情可点击下拉箭头查看 4. 选择接入方式 5. 输入 1 个合法的容器名称 6. 选择要[绑定的数据仓库或执行](/docs/gear/databinding) 7. 设置容器空闲关闭时间 8. 配置[端口映射](/docs/concepts/#多端口映射) 9. 点击「执行」 ![创建](/img/docs/getting-started-4.png) 系统会根据提交的内容创建一个算力容器,跳转到以下界面说明容器已经在准备中了: ![执行](/img/docs/getting-started-7.png) 稍等片刻会出现这样的页面: ![执行ing](/img/docs/getting-started-8.png) 说明容器已经准备好了,点击那个显著的按钮「打开工作空间」就可以看到一个 Jupyter 工作空间的界面了: ![工作空间](/img/docs/getting-started-9.png) 后面就可以在这里创建新的 Jupyter 工作空间了。 ## 数据存储说明 容器中有两个主要的存储位置: ### 系统盘(根目录 `/`) * 这是临时存储区域 * ⚠️ 容器关闭后,这里的所有数据都会被清除,不会占用整体的存储空间 * 不要在这里存放任何需要保留的文件 ### 工作空间(`/openbayes/home`) * 这是持久化存储区域 * 所有需要保存的数据都必须放在这里 * 容器关闭后,这里的数据会自动保存并占用整体的存储空间 * 下次启动容器时可以继续使用 :::info 重要提示 请始终将需要保存的文件(代码、数据、模型等)放在 `/openbayes/home` 目录下。 ::: ## 了解更多 想要了解更多关于数据存储和管理的信息,可以参考以下文档: * [关键概念](/docs/concepts) - 了解更多关于工作目录和存储空间的概念 * [数据绑定](/docs/gear/databinding) - 学习如何通过数据绑定扩展可用存储空间 * [数据仓库](/docs/data-warehouse) - 了解如何管理和复用数据集 * [常见问题](/docs/faq) - 查看更多关于存储空间的常见问题 --- ## 配额限制 ## 资源额度和配额限制 OpenBayes 中和资源使用相关的限制,主要分为两类: 1. **资源额度 / 余额**:决定当前是否还有可用的计算时长、存储空间或账户余额。 2. **配额限制(limitation)**:决定当前账号最多允许创建多少个资源,或者最多允许同时运行多少个资源。 用户在不同资源下的额度余额可在「账号设置」-「资源使用状况」页面查看: ![](/img/docs/gear-limitation-1.png) 运行系统会优先从该页面所展示的算力资源中扣费,默认每小时进行一次扣费。当这里的算力时间配额用尽时,系统会开始从用户的余额中扣费。如果用户的余额不足以支付当前运行的算力资源,系统将会停止运行该算力容器。 :::info 即使账户余额充足、集群中仍有空闲资源,**只要触发了 limitation,也仍然无法继续创建或启动对应资源**。因此,能否启动一个容器,通常需要同时满足以下条件: - 账号仍有足够的资源额度或余额; - 当前资源没有超过 limitation; - 集群里确实还有空闲资源。 ::: ## 配额限制(limitation)是什么 配额限制用于控制当前账号下资源的最大并发,以及各类资源可拥有的总数量。它的作用是限制账号的使用上限,而不是修改当前余额或集群规模。 在「账号设置」-「资源使用状况」-「配额限制」中,可以看到当前账号的主要 limitation: ![](/img/docs/gear-limitation-2.png) 常见的 limitation 可以分为以下几类: ### 1. 各类算力资源的并行限制 例如 `cpu`、`cpu-xlarge`、`rtx-4090`、`a6000` 等资源,都会分别配置一个并行上限,表示该账号**同时运行中的该类资源实例数**不能超过这个值。 当某个资源已经达到上限时,再次创建对应容器会报错,例如: `资源 RTX-3090 超出个人限制` ![](/img/docs/gear-limitation-3.png) 将某个资源的限制设置为 `0`,表示当前账号被禁止使用该资源。 ### 2. GPU 类型的总量限制 除了按资源名称分别限制并发数外,平台还会按 **GPU 类型** 设置一个额外的总量上限,例如 `A6000`、`V100-32`、`RTX-4090` 等。 这类限制和上面的“资源并行限制”是**同时生效**的: - 资源 limitation 限制的是某个具体资源可以并行运行多少个实例; - GPU limitation 限制的是某一类 GPU 总共最多能被占用多少张。 例如,某个资源每个实例需要 2 张 `A6000`: - 如果该资源的并行限制为 `3`,理论上最多可开 3 个实例; - 但如果 `A6000` 的 GPU 限制只有 `4`,那么实际上最多只能同时开 2 个实例。 因此,**最终可运行的数量,取决于资源 limitation 和 GPU limitation 两者中更严格的那个**。 ### 3. 数据集、容器(项目)和模型部署个数限制 除了运行时并发限制外,账号还会有“拥有数量”方面的限制,包括: - 私有数据集个数限制; - 公有数据集个数限制; - 私有容器个数限制; - 公有容器个数限制; - 私有模型部署个数限制; - 公有模型部署个数限制。 这里限制的是该账号当前**拥有的资源数量**,而不是同时运行中的数量。 其中模型部署(Serving)也分为私有和公开两类: - 创建新的私有模型部署时,会检查私有模型部署个数限制; - 将一个私有模型部署改为公开时,会检查公有模型部署个数限制; - 如果当前个数已达到上限,则无法继续创建或公开对应的模型部署。 ### 4. 组织个数限制 个人账号还会有“可创建的组织个数限制”。当达到上限后,将无法继续创建新的组织。 ### 5. 组织成员 limitation 除了账号级和组织级 limitation 外,组织还可以为成员设置单独的 limitation。 - 成员 limitation 目前主要用于限制成员在组织内可使用的各类资源并行数; - 成员 limitation 不会放宽组织本身的 limitation,而是会和组织 limitation 同时生效; - 因此,成员实际可使用的上限,取决于“成员 limitation”和“组织 limitation”中更严格的那个。 例如,组织的 `rtx-4090` 并行限制为 `4`,某个成员的 `rtx-4090` limitation 为 `1`,那么该成员最多只能同时使用 1 个对应资源实例,即使组织整体还有剩余配额也不例外。 更多说明见 [组织资源管理](/docs/org/resource-management/#组织成员-limitation)。 ### 6. 运行中的快照个数限制 工作空间创建快照时,平台会限制当前账号**同时处于未完成状态的快照数量**。只有已有快照完成或被删除后,才能继续创建新的快照。 ### 7. 单次上传大小限制 页面中还会显示“上传资源限制(MB)”,表示当前账号**单次上传数据时允许的最大体积**。 这项限制和前面的“数量 / 并发 limitation”不同,它主要受当前剩余存储空间影响。如果剩余存储空间不足,即使其他 limitation 仍有余量,也可能无法继续上传更大的文件。 --- ## 资源计费方式 OpenBayes 共有 4 种计费方式,用户在执行启动阶段,即可按需选择算力类型及相应的计费方式: ![计费方式](/img/docs/payment-methods-1.png) - **按量付费:** 按照所选算力每小时的价格结算,每小时结算 1 次,不足 1 个小时按比例结算。 - **包日:** 按照包日价格一次性扣费后,该执行可在 24 小时内任意使用此资源。 - **包周:** 按照包周价格一次性扣费后,该执行可在 7 天内任意使用此资源。 - **包月:** 按照包月价格一次性扣费后,该执行可在 30 天内任意使用此资源。 :::caution 注意 选择包日/周/月后,所选的计费方式仅适用于您当前创建的该次执行。也就是说,仅此次执行将在所选的计费周期内持续享有该算力资源,并非意味着您可以在此周期内使用该算力创建多次执行任务或启动新容器。 ::: ### 自动续租 自动续租默认为打开状态,可以在选择算力方式界面或执行的设置界面关闭。 ![自动](/img/docs/payment-methods-2.png) ![续租](/img/docs/payment-methods-3.png) :::caution 注意 如关闭计算方式自动续费,订阅到期后该次执行将立即自动关闭,相关的计算资源也将被自动释放,请您提前规划,以免造成训练数据的损失。 ::: ## 修改计费方式 用户选择计费方式后,可以在该执行的「设置」界面选择升级或取消当前计费方式。 ![修改计费方式](/img/docs/payment-methods-4.png) ### 升级算力订阅 点击「升级算力订阅」后,根据弹出页面展示的价格,补齐两种计费方式之间的差价,差价计算方式如下: ![升级](/img/docs/payment-methods-5.png) 1. 计算已使用费用:系统将根据用户已经使用的小时数(向上取整),按照当前所选计算方式每小时的价格,结算出费用 A; 2. 计算剩余费用:使用已支付的费用减去费用 A 后得到剩余费用 B; 3. 计算需补差价:用升级后计算方式的价格减去费用 B,即为您需要补的差价。 例如用户订阅了单卡 RTX 4090 的包日服务,在使用 13.3 小时后希望升级为包周服务,用户需要补充的差价为 : ```txt RTX 4090 包周价格 -(RTX 4090 包日价格 - 14 小时 x RTX 4090 包日价格/24 小时) ``` ### 取消算力订阅 点击「取消算力订阅」后,平台将退回剩余金额,取消后将按照按量付费的方式运行。退款金额计算方式如下: ![取消](/img/docs/payment-methods-6.png) 1. 计算已使用的费用:系统将按所选算力按量计费价格乘所用的小时数(向上取整)计算出费用 A; 2. 计算退款费用:您已支付的费用减去费用 A 后,即为您将得到的退款费用。 例如用户订阅了单卡 RTX 4090 的包周服务,使用了 13.3 小时后想要降级,退款费用为: ```txt RTX 4090 包周价格 -(RTX 4090 按量计费每小时单价 x 14 小时) ``` :::caution 注意 计算方式无法降级为其它周期的计算方式,只能选择升级或者取消当前算力订阅。 ::: ## 查看剩余使用时间 点击左侧「财务中心」,在「我的算力订阅」下可以看到已购算力订阅的执行记录、其对应的计费方式以及剩余使用时间。 ![查看剩余时间](/img/docs/payment-methods-7.png) --- ## 资源以及用量 OpenBayes 中用户在使用时需要两类有额度限制的资源类型: 1. 存储资源 2. 计算资源 下面分别对两类资源进行详细介绍,并说明如何查看、购买以及管理和清理资源。 ## 存储资源 由于容器的执行、数据的上传和日志打印都会产生数据,并且这些数据会永久保存在 OpenBayes 中,所以平台会对所有这些数据计算一个总大小,代表用户存储资源的总用量。您可以在「资源使用状况」-「概览」中查看当前的存储资源用量和总额度。 ![概览](/img/docs/quota-and-usage-1.png) 以下行为会占用额外的存储空间: - 上传数据到「数据仓库」 - 启动新容器并在容器的「工作空间」中产生新数据 - [将工作目录创建为数据仓库版本](/docs/gear/output/#将工作目录创建为数据仓库版本) 以下行为会释放存储空间: - [删除数据集或者某一个数据集版本](/docs/data-warehouse/datasets/#数据版本的删除与整个数据集的删除)(模型及模型版本的删除同理) - [删除整个容器](/docs/gear/#容器的删除) 或者 [删除具体的一个执行](/docs/gear/records/#删除不再使用的执行记录) ## 计算资源 任何容器的运行都需要相应类型「算力」的计算资源,该资源以时间为单位,当相应「算力」类型的容器标记为「运行中」后即开始计算资源的使用。计算资源有以下的特点: - 一旦被消耗就无法返还了 - 容器一旦启动,即意味着无法更改「算力」选择,如需更改请停止运行后重新启动 - 目前计算资源支持 4 中计费方式,分别为「按量付费」、「包日」、「包周」和「包月」,更多详情参考[资源计费方式](/docs/payment-methods) - 如选择按量付费,当用户余额用尽后,运行的容器会被系统强制关闭,并标记为「欠费关停」,请确保账户余额充足,推荐在设置中开启短信通知,实时跟进容器运行状况 ![欠费关停](/img/docs/quota-and-usage-2.png) :::caution 注意 容器在标记为「运行中」后才开始计费,直到标记为「关闭」/「执行完毕」/「执行出错」。也就是说,标记为「准备中」的容器不会产生计算资源的消耗。 ::: ## 当前额度的查询 在「资源使用状况」-「概览」查看当前资源用量: ![资源用量](/img/docs/quota-and-usage-3.png) 其中计算资源依据不同的算力类型分别展示。 ## 购买额外的资源 在财务中心完成「余额充值」后,可在新建模型训练步骤依据任务需求,选择合适的算力: ![充值](/img/docs/quota-and-usage-4.png) ### 购买计算资源 目前计算资源支持 4 中计费方式,分别为「按量付费」、「包日」、「包周」和「包月」,更多详情参考[资源计费方式](/docs/payment-methods)。用户可以在「资源使用状况」-「概览」查看当前的计算资源用量,显示了当前的用量和总额度。 ### 购买存储资源 存储资源可以从左侧导航进入「财务中心」- 点击「订阅存储空间」进行购买。 存储资源以订阅的方式按照「存储上限」计费: ![订阅存储空间](/img/docs/quota-and-usage-5.png) 可以看到每个存储资源可购买的类型都是以「月度」为单位的不同存储包,「20GB 19.98 每月」是指增加存储上限 20GB 持续一个月所需要的花费为 19.98 元。 存储资源默认会自动续费,在一个月周期结束前 72 小时及 24 小时,会分别向用户发送提醒邮件。如未处理,将在到期时自动从余额中扣除相应的金额。 :::danger 如果余额不足将会导致续费失败,存储资源的订阅将在下个周期自动取消。自动取消后将不再享有额外的存储空间,影响服务的正常使用。 ::: #### 存储资源的升降级 ![升降配-1](/img/docs/quota-and-usage-6.png) 存储空间的订阅可以进行调整,进入「财务中心」- 点击右侧的「升降配」调整存储空间的大小。 ![升降配-2](/img/docs/quota-and-usage-7.png) 在「升降配」界面,可以选择更换当前的存储额度,依据选择的不同存储大小进行升级或者降级: - 选择比当前更大的存储空间意味着「升级」,通过补差价的方式立即生效; - 选择比现在更小的存储空间意味着「降级」,在下个月将以新的订阅生效; - 如果选择「免费空间」则意味着取消当前的存储空间,下个月不再续费; :::info 所有的存储资源都是在免费的 50GB 资源的基础上增加,即选择了 20GB 的存储空间后,总存储空间变为 70GB。 ::: ## 资源更新记录的查询 资源的增加记录可以在「资源使用状况」-「资源变更详情」中看到: ![资源变更详情](/img/docs/quota-and-usage-8.png) ## 用量的查询 资源的具体消费记录可以在「资源使用状况」-「使用详情」中看到: ![使用详情](/img/docs/quota-and-usage-9.png) - 容器关闭后出现两个分别表示「计算资源」用量和「存储资源」用量的记录 - 容器在被删除后其存储资源被释放,存储空间字段显示为一个负数 - 数据仓库上传成功后增加一条「存储资源」的用量记录 - 数据仓库或者一个数据仓库的版本被删除后添加一条负数的用量,表示存储资源被释放 ## 了解更多 想要了解更多关于资源和用量的信息,可以参考以下文档: - [关键概念](/docs/concepts) - 了解更多关于 OpenBayes 的资源管理和使用 - [配额限制](/docs/limitations) - 了解账号级 limitation 的含义与不同类型的限制 - [资源计费方式](/docs/payment-methods) - 学习不同的资源计费方式 - [数据仓库](/docs/data-warehouse) - 了解如何管理和复用数据集 - [常见问题](/docs/faq) - 查看更多关于资源和用量的常见问题 --- ## Deep Learning with PyTorch 教程 [快速上手](/docs/getting-started/) 讲解了如何用 OpenBayes 运行第一个 JupyterLab,这里我们具体介绍如何用 OpenBayes 的 Jupyter 工作空间克隆一个公开教程。 [Deep Learning with PyTorch: A 60 Minute Blitz](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html) 是 Pytorch 的官方学习教程,介绍了 Pytorch 的一些基本语法、概念并介绍采用 cifar10 数据集训练了一个图像分类模型的过程。其提供了 [Google Colab](https://colab.research.google.com/) 的执行方式也允许下载 Jupyter 的 `.ipynb` 文件。Openbayes 也提供了一个整理并汉化了的版本,可以直接在 OpenBayes 下的 Jupyter 工作空间中使用。 ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-1.png) ## 克隆公开教程 在登录 OpenBayes 后选择左侧的「公共资源」-「公共教程」后,搜索「PyTorch 官方教程 用 PyTorch 实现深度学习」。 ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-2.png) 可以看到该教程采用了 pytorch 1.9 并使用了 vGPU 类型的容器。点击右上角的「克隆」将该容器克隆为新的容器。 ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-3.png) 如上图所示,克隆容器后可自主选择「算力资源」和「运行时环境」。 :::info 如果公开教程同时绑定了其他公开的模型或者是数据集,「克隆」的时候也都会默认绑定上。 ::: 稍等一会后可以看到一个开启了的容器: ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-4.png) 点击「打开 Jupyter 工作空间」即可使用 JupyterLab 工作空间。 ![](/img/docs/2021-08-25-17-30-46.png) :::caution 注意 如果你看到了如下的提示,请点击允许,该功能将会支持 JupyterLab 执行完成的浏览器提醒。 ![](/img/docs/2021-08-25-17-28-53.png) ::: 如果你还不知道如何使用 JupyterLab,可以参考我们的 [Jupyter 工作空间](/docs/gear/workspace) 文档、[JupyterLab 官方文档](https://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html) 或相关的[中文翻译资料](https://zhuanlan.zhihu.com/p/33898478)。 ## 执行教程 在开启的 Jupyter 工作空间的左侧目录中双击文件 `Deep Learning with PyTorch.ipynb` 打开该文件。 ![](/img/docs/2021-08-25-17-35-41.png) 然后就可以浏览教程并逐个章节进行学习了。 如果需要重新启动该教程,可以在顶部导航栏中选择「Kernel」-「重启内核」。 如果想要一次性执行 `ipynb` 文件中的所有代码可以选择「Kernel」-「重启服务并运行所有代码块」。 ## 下载文件 在进行了一系列编辑工作之后,需要把已经更新了的 `.ipynb` 下载的本地。下载的方式有多种。 ### 从 Jupyter 工作空间中直接下载 对于正在运行中的 Jupyter 工作空间,可以对想要下载的文件鼠标右键,点击下载即可。 ![](/img/docs/2021-08-25-17-39-11.png) 如果希望下载整个目录可以在左侧导航的空白位置右键选择「打包下载所在文件夹」会自动打包并下载当前目录: ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-5.png) ### 从工作目录选项卡下载 如果 Jupyter 工作空间已经被关闭,可以通过页面的「输出」选项卡进行下载。其中可以在右侧选择「下载当前目录」。 ![](/img/docs/tutorial-jupyterlab-deep-learning-with-pytorch-6.png) 也可以通过文件列表右侧的下载按钮直接下载单个文件。 :::note 在运行中的容器其「输出」选项卡下的文件会周期性从容器中同步数据,因此和容器中相比,其文件的更新时间会晚于容器中的文件。建议在容器执行结束后再从这里下载文件,以免获取了不完整的文件内容。 ::: --- ## OpenBayes 下识别手写数字 如果你了解机器学习,特别是近年来非常流行的深度学习方法,那么你很可能听说过 MNIST 这个数据集。该数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology,简称 NIST)。训练集(training set)由来自 250 个不同人手写的数字构成,测试集(test set)也是同样比例的手写数字数据。 ![](/img/docs/mnist-handwriting.jpg) 我们这里就借用这个数据集来介绍在 OpenBayes 中采用 PyTorch / TensorFlow 进行图片的分类。其中会使用到 OpenBayes 的数据集绑定、模型的训练以及模型的使用。 ## PyTorch ### 获取代码 从 GitHub 下载样例代码: ``` git clone https://github.com/signcl/openbayes-mnist-example.git cd openbayes-mnist-example/pytorch ``` 切换到所下载代码目录看到代码结构如下: ``` . ├── openbayes.yaml └── train.py ``` 其中, 1. `.py` 包含了执行机器学习模型训练和采用模型进行推断的代码 2. `openbayes.yaml` 包含了执行一个「Python 脚本执行」的配置,更多信息见 [openbayes cli 配置文件](/docs/cli/config-file/) ### 创建第一个任务 :::caution 注意 这里介绍的是通过页面上传代码压缩包的流程,但是**这已经不再是我们推荐的创建「Python 脚本执行」的最佳实践了**,更好的方式参见 [bayes 命令行工具入门](/docs/cli/)。 ::: 数据集准备好后在页面左侧导航栏点击「新建算力容器」创建一个Python脚本执行任务,采用 `train.py` 训练一个 Pytorch 的手写识别模型。 在 "新建容器" 页面下接入方式选择 Python 脚本执行,并将目录中 train.py 上传。在执行命令处输入命令: ``` python train.py ``` >`train.py` 中参数的解析采用了 Python 内置的库 `argparse` 进行处理,更多内容见 [argparse — Parser for command-line options, arguments and sub-commands](https://docs.python.org/3/library/argparse.html)。 ![](/img/docs/mnist-select-task.png) 算力选择 CPU(如果有其他 GPU 类型,推荐选择 GPU 类型,速度会快很多),然后镜像选择「pytorch-1.8」, ![](/img/docs/mnist-select-resource.png) 提交任务后等待 15 秒左右的时间任务将开始执行,在容器页面可以看到日志所展示的执行情况。 ![](/img/docs/mnist-task-running-view.png) ## TensorFlow ### 获取代码 从 GitHub 下载样例代码: ``` git clone https://github.com/signcl/openbayes-mnist-example.git cd openbayes-mnist-example/tensorflow ``` 切换到所下载代码目录看到代码结构如下: ``` . ├── inference.py ├── openbayes.yaml └── train.py ``` 其中, 1. `.py` 包含了执行机器学习模型训练和采用模型进行推断的代码 2. `openbayes.yaml` 包含了执行一个「Python 脚本」的配置,更多信息见 [openbayes cli 配置文件](/docs/cli/config-file/) ### 创建第一个任务 :::caution 注意 本文介绍了通过页面上传代码压缩包的流程。然而,这已不再是我们推荐的创建「Python 脚本」的最佳实践。更好的方法请参见 [bayes 命令行工具入门](/docs/cli/)。 ::: 数据集准备好后,在页面左侧导航栏点击「新建算力容器」创建一个 Python 脚本执行的任务,采用 `train.py` 训练一个 TensorFlow 的手写识别模型。 在 "新建容器" 页面下选择「Python 脚本执行」在执行命令处输入命令: ``` python train.py -o /openbayes/home -e 50 -m model.h5 -l ./tf_dir ``` ![](/img/docs/mnist-task-tensorflow-select-task.png) 其中: 1. `train.py` 为用于模型训练的 py 文件 2. `-o /openbayes/home` 指明所要保存的文件目录为 `/openbayes/home`,**在 Python 脚本执行模式下,系统会将 `/openbayes/home` 目录下的结果进行保存并上传,因此所有的工作目录结果都应保存在该目录下**,**其他目录下,甚至包含默认的 . 目录下的文件更新都将不会被保存** 3. `-e 50` 指定了模型训练的 `epoch` 值 4. `-m model.h5` 指明的保存的模型的名称,当然结合 `-o /openbayes/home` 参数,最终的训练模型会存储到 `/openbayes/home/model.h5` 下 5. `-l ./tf_dir` 默认 `./tf_dir` 指向 OpenBayes 取 TensorBoard 的目录 >`train.py` 中参数的解析采用了 Python 内置的库 `argparse` 进行处理,更多内容见 [argparse — Parser for command-line options, arguments and sub-commands](https://docs.python.org/3/library/argparse.html)。 下一步算力选择 CPU,镜像选择 "tensorflow-2.8",接入方式选择「Python 脚本执行」,并将目录中 train.py 文件上传。 ![](/img/docs/mnist-task-tensorflow.png) 提交后等待 15 秒左右的时间任务将开始执行。任务开启的时间通常与所绑定数据集大小有关,所需数据集越大,容器执行准备时间越长。在容器页面可以看到日志所展示的执行情况。 ![](/img/docs/mnist-tensorflow-running-view.png) 点击「TensorBoard 可视化」可以通过 TensorBoard 查看执行中的模型信息。 ![](/img/docs/mnist-tensorboard.png) ### 查看执行的目录以及输出结果 执行完毕后,点击容器页面的「工作目录」选项卡可以看到我们所指定的模型已经创建好了。 ![](/img/docs/mnist-tensorflow-model-output.png) ### 用训练好的模型进行分类 在获取了训练模型后,我们就可以用其对数据进行分类预估了。在已经完成了的执行页面点击右上角的「继续执行」,进入新的执行构建页面。 这里将上一次的「工作目录」的绑定指向 `/openbayes/home`。更多有关「继续执行」的细节见[算力容器的继续执行](/docs/gear/#继续执行)。 ![](/img/docs/click-continue-run.gif) 修改指定执行命令: ``` python inference.py -m /openbayes/home/model.h5 ``` ![](/img/docs/mnist-continue-inference-select-task.png) 其中 `-m /openbayes/home/model.h5` 指定需要载入的模型的目录。提交并执行完毕后,可以看到日志中展示了对 10000 测试结果获取了 98% 的准确率。 ![](/img/docs/mnist-tensorflow-inference-result.png) --- ## OpenBayes 文档中心 import FeatureGrid from "@site/src/components/FeatureGrid" 欢迎来到 OpenBayes 文档中心。OpenBayes 提供了更简单的方式执行你的机器学习代码,让你不再因驱动的安装、复杂的环境配置、类库的管理以及计算资源的匮乏而阻碍你模型的创建和使用。 [**快速上手** 快速上手可以帮助你快速注册 OpenBayes,了解最基本的算力容器创建流程](/docs/getting-started/) [**Jupyter 工作空间教程** 通过 Deep Learning with PyTorch 项目来快速上手 JupyterLab(Jupyter 工作空间)并熟悉基本操作](/docs/tutorial-jupyterlab-deep-learning-with-pytorch/) [**MNIST 教程** 之后你可以继续查看 MNIST 教程对图像分类的样例做进一步的了解](/docs/tutorial-mnist/) [**核心概念** 也可以去核心概念了解一下 OpenBayes 的容器、数据仓库、输入、输出、镜像等关键概念和功能](/docs/concepts/) [**常见问题解答** 在这里可以查看用户经常遇到的问题,我们对类似的问题进行了汇总解答](/docs/faq/) [**资源以及用量** 了解 OpenBayes 具体是如何计费的,以及如何查看、购买相应的资源](/docs/quota-and-usage/) [**算力容器** 对 OpenBayes 中最基本的运算单元的详细介绍](/docs/gear/) [**数据仓库 Data Warehouse** 对 OpenBayes 数据仓库的详细介绍,以及数据集、模型存储之间的区别](/docs/data-warehouse/) [**公共资源 Open Resources** 对 OpenBayes 公共资源的介绍](/docs/open-resources/) [**自动调参 Hypertuning** 介绍了如何通过 CLI 命令行工具创建和管理自动调参](/docs/hypertuning/) [**CLI 命令行工具** 了解如何通过命令行工具 `bayes` 与 OpenBayes 服务进行交互](/docs/cli/) 在使用中如果遇到任何问题、或者有什么好的建议、改进,都可以[联系我们](/support/)。 --- ## HPC 入门教程 本教程以 gromacs 软件为例,介绍如何从零开始在超算平台上运行计算任务及相关命令说明。 ## 创建容器 1. 点击左侧「高性能计算」,新建一个容器 ![新建容器](/img/docs/hpc-gromacs/1.png) 2. 选择所需算力 3. 「计费方式」处选择所需付费方式 4. 「选择镜像」处选择所需软件,此处以「gromacs」为例 ![新建容器2](/img/docs/hpc-gromacs/2.png) 5. 「容器名称」处输入 1 个合法的容器名称 6. 「数据绑定」处选择要绑定的数据仓库或执行 7. 根据自身需求,配置端口映射 8. 点击「执行」 ![执行容器](/img/docs/hpc-gromacs/3.png) 9. 等待容器分配好资源,状态变为「运行中」后,点击「打开工作空间」。 ![打开工作空间](/img/docs/hpc-gromacs/4.png) ## 命令行运行 gromacs 任务 本案例将展示如何运用 gromacs 执行分子动力学模拟计算,完整任务运行约需 10h,此处仅提供相关命令说明。 ### 准备输入文件及脚本 进行分子动力学计算时,需要准备以下 6 个关键文件(可在[公共资源](https://openbayes.com/console/public/datasets/pGQ1OKsZoSW/1/overview)下载使用或直接 input): laki.pdb(蛋白)、ions.mdp、md.mdp、minim.mdp、npt.mdp、nvt.mdp (mdp 文件定义了分子动力学模拟的参数,包含了一系列的选项,用于控制模拟的各个方面,如时间步长、温度耦合、压力耦合、模拟类型) ### 上传输入文件 - 方法一:提前上传到自己的数据集,启动容器时直接 input,详情可参考 [算力容器数据绑定](/docs/gear/databinding/) - 方法二:容器启动后直接在「工作空间」内上传或直接将文件拖入左侧对应目录处,如下图所示 ![上传文件](/img/docs/hpc-gromacs/5.png) :::info 用 vim 创建文本文件 文本文件可以用 vim 创建文本文件到工作目录,例如在 input0 绑定的数据集「gromacs 准备文件 mdp 计算文件」创建文本文件: 打开一个终端,首先切换至自己的数据集目录下,这里切换 input0 目录: `cd /openbayes/input/input0` 在终端输入 vim 即可进入 vim 编辑器,如下所示: ``` (base) root@liangzhong-4ay9ej85pxvd-main:/openbayes/input/input0# ls 1aki.pdb (base) root@liangzhong-4ay9ej85pxvd-main:/openbayes/input/input0# vim test.txt ``` Vim 常用代码: - 输入 i 进入插入模式 - 输入 Esc 退出插入模式 - 输入 :wq 保存退出 ::: ### 使用软件 #### 软件调用 以 gromacs 为例,配置环境变量,其他软件只需替换此命令对应的路径「/data/app/gromacs/bin」: `export PATH=/data/app/gromacs/bin:$PATH` #### 提交任务命令 使用 nohup 确保 gromacs 的 mdrun 命令在后台运行。它将使用 GPU 进行邻居搜索,使用 CPU 进行 PME 计算,并将所有输出保存到「log.txt」文件中: `nohup gmx_mpi mdrun -deffnm md_0_1 -v -nb gpu -pme cpu > log.txt &` 脚本说明: - 输入该代码后将开始计算任务。为避免在运行任务时,终端会实时弹出运行日志,无法进行其他操作,可以在代码后添加「> log.txt &」使得日志报告不再于终端中弹出,而是自动写入「log.txt」的文本。 - `gmx_mpi mdrun -deffnm md_0_1 -v -nb gpu -pme cpu` 可以替换为其他命令,如 bash、sh、py 等执行文件。以下为上述命令具体说明: - `nohup`:该命令会忽略所有的挂起信号,即使用户退出终端会话,指定的命令仍然会继续执行。 - `gmx_mpi mdrun`:这是 gromacs 软件中用于执行分子动力学模拟的 MPI 版本命令。gmx_mpi 是 gromacs 的 MPI 版本,用于在多处理器系统上并行运行模拟。 - `-deffnm md_0_1`:这个选项指定了模拟的默认输出文件名。在这里,md_0_1 是输出文件的基本名称,gromacs 会根据这个名称生成一系列的输出文件,如能量文件、日志文件等。 - `-v`:这个选项使 mdrun 命令在运行时输出详细的信息,包括进度、性能统计等。 - `-nb gpu`:这个选项指定了邻居搜索算法应该在 GPU 上执行。nb 代表「neighbor 搜寻」,这是分子动力学模拟中的一个关键步骤,用于确定原子之间的相互作用。 - `-pme cpu`:这个选项指定了 PME(粒子网格 Ewald)算法,用于处理长程电荷相互作用,应该在 CPU 上执行。PME 是一种常用的方法,用于在保持周期性边界条件的同时,高效地计算电荷相互作用。 - `log.txt`:这部分将命令的标准输出重定向到文件 log.txt。这意味着所有由 mdrun 命令打印到控制台的输出都会被保存在这个文件中。 - `&`:这个符号表示命令将在后台运行。即使用户退出终端会话,命令仍然会继续执行。 ![提交任务命令](/img/docs/hpc-gromacs/6.png) ## 算力任务(作业)状态查看 命令行查看作业状态命令: `jobs -l` ![命令行查看作业状态命令](/img/docs/hpc-gromacs/21.png) 使用 tail 可以查看实时输出: `tail -f log.txt` ![使用tail](/img/docs/hpc-gromacs/7.png) :::info tail 是一个读取文本的末端的阅读器,可以根据「log.txt」的实时更新,不断弹出新的内容。输入 ctrl + c 可退出「log.txt」文本。 ::: 如果要取消作业,可用命令: `kill -9 进程id` ![取消作业](/img/docs/hpc-gromacs/8.png) ## 计算结果文件下载 当计算任务运行完毕后,可以关闭容器,避免计费。 「打开容器」-「执行记录」-「工作空间目录」-「选择需要下载的文件」即可下载结果文件到本地,参考如下图: 此处可以选择「下载当前目录」或直接下载单个文件。 ![下载当前目录](/img/docs/hpc-gromacs/9.png) ![下载单个文件](/img/docs/hpc-gromacs/10.png) 如果结果是保存在之前 input 的数据集中,可以直接在「数据仓库」中打开对应数据集: ![打开对应数据集](/img/docs/hpc-gromacs/11.png) 这里可以看到自己的数据,点击「下载当前目录」即可获取当前目录下的所有文件到本地电脑: ![下载到本地](/img/docs/hpc-gromacs/12.png) 或选择你需要的某个文件,下载当前文件/在线查看 .png 等图片文件。 ![下载本地](/img/docs/hpc-gromacs/13.png) gromacs 任务完成后直接下载生成的图片和数据即可。 ## 远程 SSH 连接 这里介绍如何使用远程 SSH 连接到本地。 在工作空间创建成功后,页面会出现 SSH 登录相关的信息,也会为该容器创建一个密码,通过该密码可以完成 SSH 的身份验证,无需其他步骤。 ![下载本地](/img/docs/hpc-gromacs/14.png) ### 方法一:在支持 SSH 的客户端中连接服务器 详细文档见[通过 SSH 连接运行中的 Jupyter 工作空间](/docs/gear/ssh)。 ### 方法二:X-shell(需要使用自己的邮箱注册下载正版软件) 在本地打开 X-shell,新建 SSH 连接(如下图所示): ![X-shell](/img/docs/hpc-gromacs/X-shell1.jpg) 在链接界面输入以下平台容器信息: - 名称:(这里输入 1 个合法的名称) - 协议:SSH - 主机:openbayes.com - 端口号:31977(这里需要输入所启动容器的对应端口号) ![输入平台容器信息](/img/docs/hpc-gromacs/X-shell2.jpg) 接受主机密钥 ![接受主机密钥](/img/docs/hpc-gromacs/X-shell4.jpg) 输入用户名:root 输入自定义密码 ![输入用户名](/img/docs/hpc-gromacs/X-shell3.jpg) 连接成功(如下图所示): ![连接成功](/img/docs/hpc-gromacs/X-shell5.jpg) ## 常见问题 ### 软件位置在哪里? 软件 app 的位置在 data/app 目录下。 ![软件位置](/img/docs/hpc-gromacs/app.jpg) ### 容器内时区是什么? 容器里默认展示的是 UTC 时间,即 0 时区时间,所以服务器中提供的算力任务预计完成时间需要加 8 小时为北京时间。 例如:下图中显示该作业任务将于 2024 年 12 月 24 日 1:55:34 完成,所以实际完成时间约为北京时间 2024 年 12 月 24 日 9:55:34。 ![任务完成时间](/img/docs/hpc-gromacs/20.png) ## 教程示例 [GROMACS 入门教程-以「水中的溶菌酶」为例进行分子动力学模拟](https://openbayes.com/console/public/tutorials/jJnbW35wL3j) --- ## RStudio 操作指南 本教程将介绍在 OpenBayes 平台使用 RStudio 进行高性能计算的入门操作。 ## 创建容器 1. 点击左侧「高性能计算」,新建一个容器 ![新建容器](/img/docs/hpc-gromacs/1.png) 2. 选择所需算力 3. 「计费方式」处选择所需付费方式 4. 「选择镜像」处选择所需软件,此处以「rstudio」为例 ![新建容器2](/img/docs/hpc-rstudio/2.png) 5. 「容器名称」处输入 1 个合法的容器名称 6. 「数据绑定」处选择要绑定的数据仓库或执行,如果没有需要绑定的数据可以忽略 7. 点击「执行」 ![执行容器](/img/docs/hpc-rstudio/3.png) 8. 等待容器分配好资源,状态变为「运行中」后,在「API 地址」处点击链接。 ![打开工作空间](/img/docs/hpc-rstudio/4.png) ## 账号密码 进入 RStudio Server 页面前需要输入账号和密码。 - 账号:rstudio - 密码:rstudio ![账号密码](/img/docs/hpc-rstudio/5.png) ## 进入 RStudio 工作目录 本教程使用了模拟心理学上一个比较常用的量表抑郁量表的测评数据进行分析演示,[示例数据集获取](https://www.kdocs.cn/l/ctsBA2PtmMy5)。 ### 1. 进入 RStudio Server 页面 进入 RStudio Server 页面,和本地安装使用的 RStudio 是一样的,唯一不同的是「工作目录」。 在页面右下角可看到目录。 输入以下命令可以查看当前工作目录,为:/hone/rstudio ``` getwd() ``` ![查看当前工作目录](/img/docs/hpc-rstudio/6.png) ### 2. 变更工作目录 为方便数据分析,可输入以下代码将 rstudio 当前工作目录变更为 /home ``` setwd("~/home") ``` 在 home 目录下新增 data 文件夹,output 文件夹,将原始数据,输出结果及源代码文件均存在在 home 文件夹中,如下图所示。 ![查看当前工作目录](/img/docs/hpc-rstudio/7.png) ### 3. 数据准备 #### 3.1 上传数据 [示例数据集获取](https://www.kdocs.cn/l/ctsBA2PtmMy5) - 方法一:提前上传到自己的数据集,启动容器时直接 input,详情可参考 [算力容器数据绑定](/docs/gear/databinding/) - 方法二:将准备好的数据文件,点击「upload」上传至当前工作目录下,如下图所示 ![上传文件](/img/docs/hpc-rstudio/8.png) #### 3.2 读取数据 使用 readxl 函数读取准备好的 phq.xlsx 中的第 2 个 sheet。 ``` library(readxl) df <- read_excel("~/home/data/PHQ.xlsx",1) ``` 读取完成后在运行以下代码,读取它的前 6 行。 ``` head(df) ``` ![读取数据](/img/docs/hpc-rstudio/9.png) 对数据进行初步预处理,核查: 1. 数据类型; 2. 分类因子化; 3. 是否有缺失值。 分类因子化: ``` factor(df$gender,ordered = TRUE) factor(df$grade,ordered = TRUE) ``` 数据类型: ``` str(df) #确认各列数据的类型 ``` 查看是否有缺失值: ``` sum(is.na(df))#查看是否有缺失值 na.omit(df)#如果有缺失值,删除缺失值 ``` ![数据预处理](/img/docs/hpc-rstudio/10.png) ### 4. 数据分析 #### 4.1 计算量表总分 输入以下命令,使用 apply 函数对 4—12 列按行求和。 ``` df$phq <- apply(df[c(4:12)],1,sum) head(df) ``` ![计算量表总分](/img/docs/hpc-rstudio/11.png) #### 4.2 利用 cut 函数进行结果等级划分 得到计算结果后要对分数进行划分,这里 PHQ 量表的划分标准为:1-4分正常,5-9分轻度抑郁,10-14分中度抑郁,15-19分中重度抑郁,20-27分重度抑郁。输入以下命令,模型即可按照标准划分。 ``` df$level <- cut(df$phq,c(0,4,9,14,19,27),labels = c("正常","轻","中","中重","重")) df ``` ![利用 cut 函数进行结果等级划分](/img/docs/hpc-rstudio/12.png) #### 4.3 利用 psych 包进行描述性统计 得到划分结果后,要对数据进行描述统计。首先需要安装「psych」,输入以下命令进行安装。 ``` library(psych) ``` 安装完成后输入以下命令加载「psych」。 ``` phqdescri <- psych::describe(df) phqdescri ``` ![利用 psych 包进行描述性统计](/img/docs/hpc-rstudio/13.png) #### 4.4 不同得分等级的数量汇总分析 利用 table 进行整体数量分析汇总,这里可以使用 psych 包中的 describeBy 函数,按年级和性别分类汇总不同等级的下数量分布。 首先输入以下命令,对不同的分等级的数量进行汇总。 ``` levelphq <- table(df$level) #各等级的数量 levelphq ``` 然后分别输入以下命令,按性别和年级分类汇总不同等级下的数量分布。 ``` genderlevel <- df l> subset(select=c(gender,level))l> table()l> addmargins() #不同性别抑郁等级分布情况 genderlavel ``` ``` genderlevel <- df l> subset(select=c(gender,level))l> table()l> addmargins() #不同年级抑郁等级分布情况 genderlavel ``` ![不同得分等级的数量汇总分析](/img/docs/hpc-rstudio/14.png) #### 4.5 利用 psych 包中的 describeBy 函数计算得分均值 输入以下命令即可开始计算: ``` henderDescri <-psych::describeBy(df[c("phq")], list(df$gender))#不同性别得分差异 genderDescri ``` ``` henderDescri <-psych::describeBy(df[c("phq")], list(df$gender))#不同性别得分差异 genderDescri ``` ![利用 psych 包中的 describeBy 函数计算得分均值](/img/docs/hpc-rstudio/15.png) #### 4.6 利用 psych 包中的 alpha 函数进行信度分析 ``` #信度分析 library(psych) phqr <-alpha(df[,c(4:12)]) phqr ``` ![利用 psych 包中的 alpha 函数进行信度分析](/img/docs/hpc-rstudio/16.png) #### 4.7 利用题总相关计算量表信度 利用「psych」包中的「corr」函数可以进行题总相关的信度分析。 ``` rr <- corr.test(df[,c(4:12)],df$phq) rr$r #提取相关系数 ``` ``` rr$p #提取p值 ``` ``` resultphq <- round(rr$p,3)#保存结果,设置小数点后位数为3位 conlnames(result) <- c("phq")#修改结果中的列表为phq resultphq ``` ![利用题总相关计算量表信度](/img/docs/hpc-rstudio/17.png) ## 结果保存 保存结果需要用到「writexl」包,运行以下命令安装。 ``` install.packages("writexl") ``` ![安装 writexl 包](/img/docs/hpc-rstudio/18.png) 安装完成之后,输入以下命令加载。 ``` library(writexl) ``` 上述分析时,每一步分析都会把分析结果保存,命名为一个名称。然后把这些命名的对象创建成一个列表 list。用 sink 函数在目录中创建「output」文件夹。将分析结果保存到该文件夹下。 ``` result_list <- list(df,phgdescri,genderDescri,gradeDescri,levelphg,genderlevel,gradelevel ,phqr,resultphq) sink("~/home/output/outout.txt") print(result_list) sink() ``` ![保存结果代码](/img/docs/hpc-rstudio/19.png) ![保存结果](/img/docs/hpc-rstudio/20.png) 最后可以返回控制台界面查看输出文件。 --- ## OpenBayes 自动调参介绍 在构建机器学习模型的过程中需要很多的**超参数**,**超参数**的选择极大的影响了最终获取的模型的效果,自动调参是指通过系统自动获取最优超参数集合的方法。 自动调参目前支持通过界面和命令和进行创建,如需通过命令行创建,请先[安装 bayes 命令行工具](/docs/cli/install/),并了解其基本的使用方法。 为了使用自动调参需要做以下的工作: 1. 完成自动调参的配置,主要包含两个部分: - 确定需要自动调节的**超参数**,依据自动调参的配置文档为系统指定哪些**超参数**需要调节以及调节的范围 - 确定所需要获取的**关键指标**,并在模型训练时通过 [openbayestool](/docs/gear/metrics/) 提交到 OpenBayes 系统中 2. 修改已有的代码,支持对自动调参系统所生成的**超参数**的读取 ## 快速尝试 [openbayes-hypertuning-example](https://github.com/signcl/openbayes-hypertuning-example) 是一个样例代码库,目前仓库中分别包含 TensorFlow 和 PyTorch 版本的样例,请分别在 [/tensorflow](https://github.com/signcl/openbayes-hypertuning-example/tree/master/tensorflow) 和 [/pytorch](https://github.com/signcl/openbayes-hypertuning-example/tree/master/pytorch) 目录查看。每个目录都包含了完成的 `openbayes.yaml` 以及相应的支持代码,按照其中的步骤可以运行一个自动调参的样例。 ## 修改自身代码以支持自动调参 ### 获取自动调参服务生成的参数 自动调参启动的任务可以通过两种方式获取其提供的参数: 1. 读取 `openbayes_params.json`:如上的 `parameter_specs` 会生成四个参数,那么在容器的工作目录下会出现包含这些内容的 `openbayes_params.json`: ```json title="openbayes_params.json" { "regularization": 6.933098216541059, "latent_factors": 29, "unobs_weight": 3.439490399012204, "feature_wt_factor": 102.9461653166788 } ``` 在代码执行之前通过读取该文件内的参数并使用即可 2. 读取命令行参数:通过自动调参创建的任务其参数会以如下形式被添加到执行命令上: ```bash python main.py \ --regularization=6.933 \ --latent_factors=29 \ --unobs_weight=3.439 \ --feature_wt_factor=102.9 ``` 采用 [argparse](https://docs.python.org/zh-cn/3/howto/argparse.html) 可以解析并使用这些参数。 ### 上报关键指标 在 [系统指标与自定义指标](/docs/gear/metrics/) 章节介绍了 `openbayestool` 工具有 `log_metric` 方法可以上报自定义的指标,自动调参同样采用这个工具实现指标的上报。在程序结束时通过以下代码即可实现上报: ```python import openbayestool openbayestool.log_metric("precision", 0.809) ``` 注意这里具体上报的指标名称应当和 `openbayes.yaml` 中配置的 `hyperparameter_metric` 一致。 ## 创建自动调参 ### 通过界面创建 登录控制台之后,可以从侧边栏的「自动调参」进行创建,或者从列表右上角的「创建自动调参」进行创建。 目前我们支持两种方式配置自动调参参数,可视化编辑器和 YAML 编辑器。在任意编辑器中进行编辑会同步进行更新。也就是说当用户在可视化编辑器中更新了参数后,切换到 YAML 编辑器后,配置会同步更新,反过来也相同。 ![](/img/docs/hypertuning-gui.png) ### 通过命令行工具创建 :::caution 注意 通过命令行工具创建自动调参时,需要对 `bayes` 命令行工具有所了解,可以参考 [bayes 命令行工具入门](/docs/cli/),同时还需要了解 [openbayes 配置文件](/docs/cli/config-file/)。 ::: 在准备好[自动调参配置文件](#自动调参配置说明)之后,通过命令 `bayes gear run hypertuning` 创建自动调参任务: ![](/img/docs/15639928018278.jpg) ## 查看自动调参 ![](/img/docs/15639928453804.jpg) 如上所示,自动调参页面会通过「图表」「平行坐标」等方式展示当前执行的状况,用户可以通过结果选择最好的一次执行作为结果或者依据目前的结果更新自动调参参数范围后继续新的自动调参任务。其中「平行坐标」是一个非常适合对自动调参结果进行筛选的视图,通过在界面上划定参数范围可以控制展示的参数组合。 ## 自动调参配置说明 在命令行中通过 `bayes gear init `([相关文档](/docs/cli/reference/bayes-gear-init/))将当前目录和容器绑定,执行该指令后目录下会出现文件 `openbayes.yaml`。在 `openbayes.yaml` 下按照配置要求指定**超参数**及其范围。 一个 `openbayes.yaml` 文档分为两个部分: 1. 基本配置,在 [OpenBayes 配置文件](/docs/cli/config-file/) 这部分有相应的介绍 2. 自动调参配置,只在 `hyper_tuning` 参数下有关自动调参部分的配置 在默认生成的 `openbayes.yaml` 下有如下的自动调参配置部分的样例: ```yaml title="openbayes.yaml" hyper_tuning: max_job_count: 3 hyperparameter_metric: precision side_metrics: [] goal: MINIMIZE algorithm: Bayesian parameter_specs: - name: regularization type: DOUBLE min_value: 0.001 max_value: 10.0 scale_type: UNIT_LOG_SCALE - name: latent_factors type: INTEGER min_value: 5 max_value: 50 scale_type: UNIT_LINEAR_SCALE - name: unobs_weight type: DOUBLE min_value: 0.001 max_value: 5.0 scale_type: UNIT_LOG_SCALE - name: feature_wt_factor type: DOUBLE min_value: 1 max_value: 200 scale_type: UNIT_LOG_SCALE - name: level type: DISCRETE discrete_values: [1, 2, 3, 4] - name: category type: CATEGORICAL categorical_values: ["A", "B", "C"] ``` `hyper_tuning` 下的参数就是自动调参所需要配置的内容: ### 1. `max_job_count` 一次自动调参的尝试次数,最多支持 100 次。 ### 2. `parallel_count` 并行的执行任务个数,该数值受限于用户的单个资源类型的最大并行个数(见[配额限制](/docs/limitations)),并行数目越多那么一次自动调参任务执行的就越快。 ### 3. `hyperparameter_metric` 就是所需要获取的关键指标,在下文 [上报关键指标](/docs/hypertuning/#上报关键指标) 部分会用得到。 ### 4. `goal` 所需要获取的关键指标最优解的方向(`MAXIMIZE` 或 `MINIMIZE`)。 ### 5. `parameter_specs` **超参数**的规约,即可以设置的**超参数**类型以及其范围,其中**超参数**的类型可以是以下四种: | 类型 | 数值范围 | 数据类型 | 描述 | | --- | --- | --- | --- | | DOUBLE | min_value - max_value | 浮点型 | | | INTEGER | min_value - max_value | 整数 | | | CATEGORICAL | | 枚举类型 | 字符串 | | DISCRETE | | 离散类型 | 有顺序的数值 | 其中 `INTEGER` 和 `DOUBLE` 类型还可以设定获取参数的分布类型(`scale_type`): | 分布类型 | 描述 | | ------- | --------------------------- | | UNIT_LINEAR_SCALE | 线性分布,指数据在 `min_value` 和 `max_value` 是遵循均匀分布抽样 | | UNIT_LOG_SCALE | LOG 分布,指 log(value) 在 `min_value` 和 `max_value` 之间遵循均匀分布,也就是在抽样时,数值越小其抽样的密度越大,在使用 UNIT_LOG_SCALE 时 `min_value` 必须大于 0 | ### 6. `algorithm` 自动调参可以采用的算法,支持 `Bayesian` `Random` 或 `Grid`: | 算法 | 描述 | | --- | --- | | Grid | 对于只有 `DISCRETE` 以及 `CATEGORICAL` 类型参数的场景可以通过 GridSearch 遍历所有参数的组合 | | Random | 针对 `INTEGER` 以及 `DOUBLE` 类型,依据其所支持的分布类型,在 `min_value` 和 `max_value` 之间随机选择数值,对于 `DISCRETE` 和 `CATEGORICAL` 类型,其行为和 Grid 方式类似 | | Bayesian | 每次生成参数时考虑之前的「参数」-「目标变量」的结果,通过更新后的分布函数提供参数以期望获取更好的结果,其算法可以参考 [该文章](https://arxiv.org/abs/1807.02811) | ### 7. `parameters` :::caution 注意 该参数并不是出现在 `hyper_tuning` 配置下面,而是在根层级下出现的,在 [config 配置](/docs/cli/config-file/#parameters) 部分做了介绍。在创建「自动调参任务」时提供该字段依然会产生作用。不过这里所提供的参数配置的优先级会低于自动调参过程中产生的配置,也就是说如果这部分配置中有和 `parameter_specs` 下的参数重名,那么该参数会被 `parameter_specs` 下的参数所覆盖。 ::: 举一个例子,我们配置了一个如下的 `openbayes.yaml`: ```yaml title="openbayes.yaml" ...省略其他部分... parameters: filter_size: 5 hyper_tuning: parameter_specs: - name: filter_size type: DISCRETE discrete_values: [1, 2, 3, 4] ...省略其他部分... ``` 那么每次自动调参所生成的参数组合中一定会有 `filter_size` 这个字段,那么其生成的值会覆盖掉 `parameters` 下的 `filter_size` 字段的值。 ### 8. `side_metrics` 在上文提到 `hyperparameter_metric` 是用于自动调参的关键指标,除此之外可以设置多个 `side_metrics` 作为最终指标的辅助指标,例如相对于 `accuracy` `f1_score` 指标或者在训练过程中的 `loss` 可以添加为 `side_metrics` 最为参考指标。该指标**对自动调参过程没有任何的影响,只是会在指标的可视化中被展示出来,作为自动调参结果好坏的参考**。 ![](/img/docs/show-side-metrics-in-visualization.png) 如上图所示,作为 `side_metrics` 的参考指标 `loss` 也会被展示出来。不过要注意,在代码过程中也要使用 `openbayestool.log_metric` 方法将指标记录下来,否则在可视化中无法展示出来。可以参考 [openbayes hypertuning in pytorch](https://github.com/signcl/openbayes-hypertuning-example/tree/master/pytorch) 中对 `loss` 指标的处理。 ## 自动调参的状态解释 自动调参任务在执行过程中会出现以下几种状态,这里分别对不同的状态做一些解释: 1. `运行中`:自动调参下的执行运行正常 2. `已取消`:自动调参任务由于用户主动中止而关闭了 3. `没有相应指标`:指在自动调参下的执行中没有提供**指标上报**的代码,自动调参系统发现了这个问题后中止了自动调参过程 4. `执行出错`:指自动调参下的执行出错了或者由于某些原因被中止了(可能是单个执行被关闭了,比如由于欠费等原因被系统关闭) 5. `系统错误`:指自动调参系统自身出现了某些问题导致自动调参被中止了,这种情况下可以联系系统管理员进行问题的上报 6. `搜索空间用尽`:有两种情况会出现这个结果,一个是自动调参系统认为用户提供的**超参数**范围下所生产的参数组合已经用光了接下来产生的参数是重复的了;另一个是系统认为目前已经没有办法产生更好的结果了,主动中止了搜索 --- ## 公共资源 FAQ(常见问题解答) ## 我想要 XYZ 数据集,请问可以添加吗? 可以,我们在 [公开数据集](/docs/open-resources/) 中已经内置了部分常见数据集,但肯定无法满足所有人的需要,我们也正在收集和统计用户所需求的数据集,请在控制台中通过公开数据集页面上方的聊天按钮告诉我们你想要的数据集。 ## 克隆教程后打开 API 地址显示 BadGateway 在克隆教程后的 API 地址无法正常打开,显示 BadGateway,可能导致原因如下: 1. **模型还未加载完成:** 部分项目模型过大, 在容器状态显示未「运行中」后,需要等待 1-2 分钟再打开 API 地址,具体的时间可以参考该项目 README。 2. **启动的不是第一次执行:** 每次容器的执行都是独立的环境,再次启动容器时需要在容器的「执行记录」中,选择第一次执行启动,而不是「创建执行」。 ![启动第一次执行](/img/docs/open-resources-faq-1.png) 3. **修改默认配置:** 教程已经绑定所需算力和环境,无需手动修改,如修改为较低显存、内存的 GPU 或切换为其它的环境,可能会导致模型加载时间过长或无法正常启动。 ![配置](/img/docs/open-resources-faq-2.png) ## 重新克隆显示「项目名称重复」 该报错说明您已经克隆过此教程。如需再次克隆,请先在「模型训练」页面找到原克隆容器,删除或重命名该容器后再重新进行克隆操作。 ![删除旧容器](/img/docs/open-resources-faq-3.png) --- ## 公共资源概览 OpenBayes 提供了三种类型的公共资源: 1. 公共数据集 2. 公共教程 3. 公共模型 ## 公共数据集 机器学习模型的训练通常需要使用大量的标注数据,目前市面上有大量的公共数据集(如 [PASCAL_VOC](http://host.robots.ox.ac.uk/pascal/VOC/))方便机器学习从业者直接拿来使用。这些数据集有些规模比较巨大,为了方便用户直接在 OpenBayes 平台直接使用(而不是自己去下载后上传),OpenBayes 会周期性将这种通用的数据集通过「公共数据集」的形式提供给 OpenBayes 的用户。 :::note 当您把公共数据集中的数据以只读的方式绑定到容器中后,其数据集所用的空间不会占用个人相应的存储空间 ::: ![](/img/docs/open-resources-index-1.png) 在「创建新容器」时,可以将公共数据集绑定到容器中: ![](/img/docs/open-resources-index-2.png) ## 公共教程 公共教程主要是市面上的一些教程,方便用户熟悉 OpenBayes 的使用,通过「克隆」可以直接将教程运行起来,方便用户对相应内容的学习。 ![](/img/docs/open-resources-index-3.png) ![](/img/docs/open-resources-index-4.png) ## 公共模型 和公共数据集类似,市面上有大量的预训练模型可以用于 [迁移学习](https://machinelearningmastery.com/transfer-learning-for-deep-learning/) ,这些预训练模型通常是通过大规模的数据集以及大量的算力训练得到的。同样的,这些预训练模型也可以在创建新容器的时候绑定到容器中使用。 ![](/img/docs/open-resources-index-5.png) ## 权限 公开资源不支持批量下载,用户则必须通过 [数据绑定](/docs/gear/databinding) 后访问该内容。 --- ## 组织功能概览 OpenBayes 支持创建组织。组织可以方便的管理数据仓库和容器等资源。并可以通过添加组织成员来实现多人协作。 ## 创建组织 在登录 OpenBayes 后,点击导航条上的用户名可以看到一个下拉菜单,点击「创建新组织」。 ![](/img/docs/2021-07-28-17-26-13.png) 给一个组织的 id 并提供一个组织邮箱即可创建组织。 ![](/img/docs/2021-07-28-17-27-56.png) :::tip 创建组织允许使用已经在 OpenBayes 注册过的邮箱。 ::: ## 切换组织上下文 点击下图所示的导航栏可以选择切换用户资源的上下文,这里会罗列用户的「私有空间」以及用户所加入的所有组织。 ![](/img/docs/2021-07-28-17-33-06.png) :::info 每个组织是独立的命名空间,这意味着「数据仓库」「算力容器」在组织下有独立的访问权限。同时,组织下的「存储」「计算资源」也是独立的。也就是说在组织下构建的任何资源都会使用组织的资源(存储、算力)而不是个人的资源。 在 [组织资源管理](/docs/org/resource-management) 中对资源的可见度有更多的介绍。 ::: ## 迁移资源(数据仓库、容器) 新建的组织没有任何数据仓库以及容器。可以将已有的数据仓库和容器迁移到新建的组织中。这里以数据仓库为例做介绍。 首先选择一个「私有空间」下的数据仓库,点击导航下的「设置」可以看到页面有「转移当前数据集」的选项: ![](/img/docs/2021-07-28-17-37-20.png) 点击「转移」并按照提示输入组织名称并确认数据仓库的名称: ![](/img/docs/2021-07-28-17-38-37.png) 点击确认后,该项目会被自动迁移到指定的组织中。 ![](/img/docs/2021-07-28-17-42-16.png) :::caution 注意 只有组织的管理员迁移资源时才会自动生效,如果是组织的成员要求就资源转移到组织中,组织的管理员将会收到一封确认邮件,点击链接确认接收后才会生效。 ::: ## 邀请成员 在将 OpenBayes 控制台的上下文切换到组织后,左侧导航会出现「组织设置」: ![](/img/docs/org-index-1.png) 点击「邀请成员」可以将组织的成员邀请到组织中。 ![](/img/docs/2021-07-28-18-46-56.png) 支持邀请已经注册了 OpenBayes 的用户,也可以输入用户邮箱地址邀请新用户加入。被邀请人将会收到一封邮件,对于已经注册 OpenBayes 的用户点击邮箱链接后即可进入确认接受组织邀请的页面;对于未注册 OpenBayes 的用户点击邮箱链接进入 OpenBayes 注册页面,注册成功后将自动加入组织。 ## 成员权限 加入组织的成员可以有两种权限: 1. 普通成员,是组织内资源的使用者,可以访问有相应权限的容器、数据集等。 2. 管理员,是组织的管理者,可以邀请新的成员加入组织,并对资源有更高的权限控制。 ![](/img/docs/update-org-member-role.png) 只有组织的管理员才能修改组织成员的权限。 ## 扩充组织 组织免费提供 3 个座席,即除组织创建者外可以增加额外两个成员参与组织协作。如果希望更多的成员参与组织协作,可以通过「购买座席」来实现。 ![](/img/docs/org-index-2.png) 点击「购买座席」会出现一个购买座席的页面: ![](/img/docs/org-index-3.png) :::info 为了统一存储空间及座席订单的周期,当用户订阅存储空间且订单周期不满一个月时,座席订单金额会根据剩余天数显示为相应的折扣价格(订单总价 ✖️ 账单日与当前日期的差值 ➗ 当月总天数)。次月坐席订单将按照 ¥5/人/月 进行扣费。 ::: 选择要增加的座席,点击「购买」即可完成购买。 ![](/img/docs/2021-07-28-18-58-31.png) 座席与存储资源类似,按月收费。 --- ## 组织资源管理 每个组织是独立的命名空间,这意味着「数据仓库」「算力容器」在组织下有独立的访问权限。同时,组织下的「存储」「计算资源」也是独立的。 ## 组织资源权限 ### 权限说明 点击组织下的任意算力容器切换到「设置」页面,可以看到资源可见度的设置。 ![](/img/docs/resource-management-1.png) 在组织下资源的可见度分三种: | 资源可见度 | 描述 | | -------------------- | ---------------------- | | 个人可见 | 将容器设为私有,此操作将使该容器对组织内其他成员不可见 | | 组织只读 | 当前模式下该项目将在组织内只读,组织内成员将对该项目具有只读权限,无法在该资源下创建新的内容 | | 组织读写 | 当前模式下该项目将在组织内可读写,组织内成员将对该项目具有读写权限,可在该项目下创建新的内容,并对自己所创建的内容有编辑和删除的权限 | 和「算力容器」类似,「数据仓库」也有如上所示的权限。 :::caution 注意 组织管理员可以直接修改资源可见度。 ::: ### 默认权限 在组织内创建资源(算力容器、数据仓库等)时的权限源自「组织设置」的默认资源权限,组织管理员可以在「组织设置」中修改默认的资源权限。 ![](/img/docs/resource-management-2.png) ### 使用场景 #### 教学场景 教师创建组织成为组织的所有者,通过邀请学生加入组织。 设置资源默认权限为「个人可见」保证每个学生只能看到自己的算力容器,而不会看到其他学生的算力容器。 教师创建「数据仓库」并设置权限为「组织只读」保证学生可以使用该数据仓库,并保证不会因为其他人误操作导致数据丢失。 教师创建「算力容器」并设置权限为「组织只读」作为教学资料,学生可以以「克隆」的形式将其克隆到自己的算力容器中。 ![](/img/docs/resource-management-3.png) #### 项目协作 组织内两个成员工作在同一个项目中,希望彼此访问对方的执行内容。 成员 A 创建「数据仓库」并设置权限为「组织读写」保证不但自己可以编辑数据内容,也允许成员 B 增加新的数据版本。 成员 B 创建「算力容器」并设置权限为「组织读写」,那么成员 A 和成员 B 可以在同一个算力容器中创建执行并彼此可以访问对方正在运行中的执行内容。同时,JupyterLab 本身支持实时协作,在成员 A 和成员 B 同时打开 JupyterLab 时可以彼此看到对方的操作内容。 ## 组织「资源使用状况」 在组织下创建资源(算力容器、数据仓库等)时,存储资源以及算力的使用情况将会被记录到组织下的「资源使用状况」中。 和个人账户下的「资源使用状况」类似: - 「概览」会展示组织的存储资源总量、已用资源数量以及剩余可用资源的数量; - 「使用情况」会记录组织下每个任务的类型、日期、使用产品的类型(算力资源类型、存储空间)、每项任务使用时长及存储空间的用量; - 「资源变更详情」会记录每个资源的变更情况(例如:订阅存储空间); - 「配额限制」会记录每个资源的额度限制,这个限制由组织内成员共享;详细说明见 [配额限制](/docs/limitations); ## 组织成员 limitation 除了组织本身的 limitation 之外,组织还可以为成员设置单独的 limitation,用于进一步限制某个成员在组织内可使用的资源上限。 ### 作用范围 当前成员 limitation 主要用于限制成员在组织内对各类 **算力资源** 的并行使用上限,例如 `cpu`、`cpu-xlarge`、`rtx-4090`、`a6000` 等。 它的作用对象是“成员在组织内创建和运行的资源”,而不是成员个人账号下的资源。 ### 和组织 limitation 的关系 成员 limitation 不会替代组织 limitation,而是会和组织 limitation **同时生效**。 也就是说,一个组织成员在启动资源时,通常需要同时满足: - 该成员自己的 limitation; - 组织整体的 limitation; - 组织当前剩余可用资源与额度。 成员 limitation 只能把范围收紧,不能把组织的总上限放宽。 例如: - 组织的 `rtx-4090` 并行限制为 `4`; - 成员 A 的 `rtx-4090` limitation 为 `1`; 那么成员 A 最多只能同时使用 1 个对应资源实例,即使组织整体还有空余配额也不例外。 ### 适用场景 成员 limitation 常见于以下场景: - 教学组织中,教师希望限制每位学生最多同时使用 1 个 GPU 资源; - 团队协作中,管理员希望避免少数成员独占组织资源; - 多人共用组织预算时,希望按成员分配更细粒度的资源上限。 ## 组织「财务中心」 每个组织有独立的财务账户,不和组织的创建者共享财务账号。也就是说个人账户下的余额无法提供给组织账户使用。 ![](/img/docs/resource-management-4.png) --- ## 运行时环境 FAQ(常见问题解答) ## 如何保存我已经安装的依赖而不必每次重启都重复安装? 有以下两种方式可以保存你的依赖: 1. 在默认环境中使用 `pip install --user xxx` 命令安装依赖,这样安装的依赖会保存在用户目录下,不会因为重启而丢失。 2. 创建自定义的独立环境,并将该环境放置在用户目录下(`/openbayes/home`)。内置 Conda 的运行时参考[用 Conda 进行依赖管理](/docs/gear/conda);使用 uv 的运行时(Ubuntu 24.04 及更新,如 `vllm 0.20` 及之后)参考[用 uv 管理 Python 环境](/docs/gear/uv)。 但是对于通过 `apt` 安装的依赖无法保存,需要启动时重新安装。 ## 用 `uv pip install` 装的包,重启后怎么没了?还能用 uv 装依赖吗? 可以正常用 uv,平台没有限制 uv 命令。需要区分的是包**装到哪里**、以及**重启后是否保留**。 uv 系运行时自带的默认 Python 环境是一个位于 `/opt/venv` 的虚拟环境。`uv pip install <包名>` 会把包装进这个 venv——可以立即使用,但 `/opt/venv` 不在持久化目录下,容器重启后会丢失。 如果需要保留,根据场景二选一: - **只是在自带环境上多装或固定几个包**:用 `pip install --user <包名>`。包会装到 `/output/.pylibs`(持久化目录)并自动加入 `sys.path`,重启后依然可用,详见[保留 pip 依赖](/docs/runtimes#保留-pip-依赖)。注意 uv 自身不支持 `--user` 参数,这一步用系统自带的 `pip`。 - **需要一整套独立环境(更换 Python 版本或完全隔离依赖)**:用 `uv venv` 在 `/openbayes/home` 下创建环境,全程用 uv 管理。环境创建在持久化目录下,重启后重新 `source` 激活即可继续使用,详见[用 uv 管理 Python 环境](/docs/gear/uv)。 | 需求 | 命令 | 重启后保留 | | --- | --- | --- | | 临时装包,仅本次会话使用 | `uv pip install <包名>` | 否 | | 在自带环境上叠加 / 固定少量包 | `pip install --user <包名>` | 是(`/output/.pylibs`) | | 整套独立环境(换 Python 版本 / 完全隔离) | 在 `/openbayes/home` 下 `uv venv` | 是(环境在持久化目录) | :::info 在自建的 uv 独立环境里安装依赖时不要加 `--user`;加了之后包会装到 `/openbayes/home/.pylibs` 而不是当前环境,容易引发依赖冲突。 ::: ## 升级运行时自带的包时报错 "Will not install to the user site because it will lack sys.path precedence"? 新版平台已修复此问题:在 uv 系运行时中直接 `pip install --user <包名>` 即可升级运行时内置的包(如 transformers、numpy),新版本会正确生效并随工作空间持久保存。 如果你所在的环境仍出现此报错(集群尚未更新到新版),可临时加上 `--ignore-installed` 参数完成升级: ```bash pip install --user --ignore-installed transformers ``` 如果需要变更多个内置包的版本(例如更换整套框架版本),更推荐创建独立环境,见[用 uv 管理 Python 环境](/docs/gear/uv)。 ## 我是否可以使用自定义运行时(镜像)? 目前平台用户暂时无法直接使用自定义镜像,但可以在相应镜像中使用自定义框架(framework) 我们已经添加了 TensorFlow、PyTorch、MXNet、Darknet 常见版本的预置镜像可供直接使用。更多有关镜像的信息可以访问 [运行时环境(镜像)概览](/docs/runtimes) 了解更多信息。 我们的 [私有部署](/enterprise) 服务可为企业提供定制化镜像服务。 ## 是否提供 Caffe2 的支持? 根据 Caffe2 的 [官方公告](https://caffe2.ai/blog/2018/05/02/Caffe2_PyTorch_1_0.html),Caffe2 已合并至 PyTorch,所以我们不再提供 Caffe2 框架的支持,目前 OpenBayes 平台已支持 PyTorch 框架 --- ## 运行时环境(镜像)概览 ## 运行时环境中的通用依赖 OpenBayes 默认在运行时环境中包含了大量的基础依赖,以减少在每次容器启动时耗费运行资源进行依赖的下载与安装。 :::note 不同运行时镜像、不同标签以及不同时间点更新的镜像,预装依赖和版本都可能不同。本页内容更适合作为“常见环境说明”和“依赖管理方式”的参考,不建议将其中列出的包视为对所有运行时都成立的固定清单。 ::: 下面的信息基于一个实际运行中的 runtime 示例(2026-03 检查): - Ubuntu 22.04.5 LTS - Conda 根环境位于 `/usr/local` - Python `3.10.13` - JupyterLab `4.5.5` - Notebook `7.5.3` - CUDA Driver `13.0` - `nvcc` `12.9` 如需确认当前容器中的实际环境,建议优先在终端中执行以下命令: ```bash python --version pip list conda list jupyter --version nvidia-smi ``` :::info - 运行时提供 `python` 命令(指向 Conda 环境中的 Python),可直接使用 - Python 版本由 Conda 管理,但大部分 Python 依赖推荐使用 `pip` 安装 - `conda` 主要用于创建新环境或安装 conda-only 的包 - 当前运行时未使用 `uv` 进行依赖管理,请使用 `pip` 或 `conda` 安装依赖 ::: 预先安装的依赖可以按照用途分为以下几个方面: ### 1. 通用机器学习类库 * [scikit-learn](https://scikit-learn.org) 通用机器学习类库,包含了大量的机器学习模型、数据分析、数据挖掘算法以及可视化工具 * [ONNX](https://onnx.ai/) 深度学习模型转换类库 * [ONNX Runtime](https://onnxruntime.ai/) ONNX 模型推理运行时 * [PyTorch](https://pytorch.org/) 深度学习框架,部分运行时会同时预装 `torchvision` 和 `torchaudio` :::info 以上包是当前检查到的实际 runtime 中确认存在的常见机器学习类库。像 `xgboost`、`spaCy`、`LightGBM`、`TensorFlow` 等包是否预装,取决于你选择的具体运行时镜像,不建议默认假定一定存在。 ::: ### 2. 图像处理工具 常用的图形处理类库 * [OpenCV](https://opencv.org/) 功能强大的图像处理工具 * [Pillow](https://pillow.readthedocs.io/en/stable/) Python 下常用的图像处理工具 ### 3. 数据分析类库 * pandas * SciPy * Matplotlib * NumPy 除上述类库外,部分运行时还会带有其他科学计算或推理相关依赖,但建议始终以当前容器中的实际结果为准。 ## 如何添加不在列表中的依赖 默认的 OpenBayes 运行时环境已经安装了大量的机器学习场景下的依赖,如果你依然需要额外的依赖,可以通过以下方式安装。 :::note 运行时环境以 [Conda](https://docs.conda.io/en/latest/) 进行管理,可以支持 Conda [安装额外的依赖](/docs/gear/conda/)。 ::: :::danger 每个运行时环境所安装的 CUDA 版本有所不同,在安装额外的依赖时一定要注意和运行时环境中 CUDA 的环境相匹配。 ::: ### 安装 Python 的类库 如果你在上传代码并以「Python 脚本执行」的方式运行代码时需要一些额外的依赖,可以在上传代码的根目录定义一个名为 `openbayes_requirements.txt` 或者 `requirements.txt` 的文件,并将它和其他代码文件一并上传。在代码运行前,系统会先安装这些依赖,再执行「Python 脚本」。 该文件内容的格式和 Python 的 [`requirements.txt`](https://pyzh.readthedocs.io/en/latest/python-setup-dot-py-vs-requirements-dot-txt.html) 格式是一致的,一个典型的 `openbayes_requirements.txt` 文件内容如下: ```ini title="requirements.txt" jieba tqdm==4.11.2 ``` 其中 `jieba` `tqdm` 是两个可以通过 `pip` 安装的类库,通过以上格式即可在执行「python 脚本」之前首先安装这些类库。`tqdm==4.11.2` 的 `==` 之后指定了想要具体安装的版本。 :::danger 系统中一些核心依赖如 `tensorflow`、`torch` 的版本不建议被随意修改,因为不同版本对底层 CUDA、编译产物和其他依赖的要求可能不同,容易导致当前环境损坏或出现兼容性问题。 ::: ### 通过 Conda 进行依赖管理 对于「工作空间」这部分见 [用 Conda 管理依赖](/docs/gear/conda/)。 对于「Python 脚本执行」可以在上传的代码根目录下提供名为 `conda-packages.txt` 的文件,其文件格式遵循 [channel::]package[=version[=buildid]] 这里有一个样例: ```txt title="conda-packages.txt" conda-forge::rdkit conda-forge::pygpu ``` 如果 `requirements.txt`、`openbayes_requirements.txt` 和 `conda-packages.txt` 同时存在,那么会首先安装 `conda-packages.txt` 里的依赖,然后再安装 `openbayes_requirements.txt` 以及 `requirements.txt` 中的依赖。 ### 安装其他依赖 如果是在「Jupyter 工作空间」中可以参见下一部分。如果是「Python 脚本执行」场景你可以用以下方式安装额外的非 Python 的依赖: 1. **将依赖安装命令包含在「执行命令」中** 例如想要在运行程序前下载必要的 git 仓库,可以使用以下「执行命令」: ```bash $ git clone https://github.com/tensorflow/models.git && cd models && python ... ``` 2. **准备一个 `dependencies.sh` 脚本** 对于非 Conda 和 PyPI 的依赖,可以在根目录提供一个名为 `dependencies.sh` 的文件,在「Python 脚本执行」启动时它会被 `bash` 执行,并且其执行会早于 `openbayes_requirements.txt` `requirements.txt` 和 `conda-packages.txt` 依赖的安装。 例如可以准备一个 `dependencies.sh` 脚本,其内容如下: ```bash title="dependencies.sh" git clone https://github.com/tensorflow/models.git cd models pip install -r requirements.txt ``` :::info 你的运行时环境为 Linux Ubuntu 环境,如果想要安装额外的包依赖,可以采用 `apt-get` 或者 `apt` 命令,当然在执行之前通常需要执行命令 `apt-get update` 或者 `apt update` ::: ### 在 Jupyter 工作空间中安装依赖 在「Jupyter 工作空间」中,你可以安装任意你需要的依赖,不论是 Python 的,还是通过 `apt` 安装的系统依赖。 例如下面就是在 Notebook 中安装一个额外的 Python 依赖: ![](/img/docs/2021-02-18-16-09-04.png) 推荐优先使用 `%pip install jieba`。它比 `!pip install jieba` 更适合 Notebook 场景,因为它会明确安装到当前内核所使用的 Python 环境中。 如果需要安装系统包,可以在终端中执行 `apt-get update && apt-get install -y `,或者在 Notebook 中使用 `!apt-get update && apt-get install -y `: ![](/img/docs/15582545377314.jpg) ## 保留 pip 依赖 默认情况下,额外通过 `pip` 安装的依赖通常保存在系统环境中,容器重启后往往需要重新安装。 如果在安装时加上 `--user` 参数,则这些依赖会被保存在用户目录对应的位置。当前运行时中,`PYTHONUSERBASE` 通常指向 `/output/.pylibs`;而 `/openbayes/home` 一般会链接到 `/output`,因此你也可以把它理解为保存在工作空间里。当「工作空间」关闭后再次启动时,这部分依赖通常会随着工作空间一起保留下来。 无论是单个包还是整份依赖清单,都可以用 `--user` 一次性安装并持久化: ```bash pip install --user pip install --user -r requirements.txt ``` 即使 `requirements.txt` 中固定了运行时已内置的包(如 `numpy`、`transformers`)的版本,新版本也会正确生效并随工作空间一起保存,无需额外参数(详见[常见问题](/docs/runtimes/faq))。在使用 uv 的运行时中,请用系统自带的 `pip` 执行上述命令(`uv pip` 不支持 `--user`),且不必为此专门创建虚拟环境,详见[用 uv 管理 Python 环境](/docs/gear/uv)。 ### 1. 删除不必要的依赖 如果你不想保留这些依赖,可以在「执行命令」中添加 `rm -rf /output/.pylibs` 命令。由于 `/openbayes/home` 通常链接到 `/output`,删除 `/openbayes/home/.pylibs` 也可以达到同样效果。 ### 2. 需要不同的 Python 版本 如果需要一个不同的 Python 版本,可以在 `/openbayes/home` 目录下创建一个新的独立环境,并在其中安装完整依赖。根据运行时类型选择对应的文档: - 内置 Conda 的运行时(Ubuntu 22.04 及更早):[用 Conda 进行依赖管理](/docs/gear/conda) - 使用 uv 的运行时(Ubuntu 24.04 及更新,如 `vllm 0.20` 及之后):[用 uv 管理 Python 环境](/docs/gear/uv) 不确定当前运行时属于哪一种时,在终端执行 `conda --version`:能输出版本号即为 Conda 运行时;提示 `command not found` 则为 uv 运行时。 当前 OpenBayes 运行时中的 Python 版本并不是固定的。本文档检查到的实际示例为 `Python 3.10.13`,但你选择的具体运行时可能不同,建议通过 `python --version` 先确认。 :::info 通过 `conda` 或 `uv venv` 创建了一个全新的环境后,不要使用 `pip --user` 的参数来安装依赖;在添加 `--user` 后依赖会被安排在 `/openbayes/home/.pylibs` 下而不是新创建的环境下,容易引发依赖的冲突。 ::: ## 安装 Jupyter 工作空间扩展 「Jupyter 工作空间」支持安装扩展,但扩展的安装方式会随着 JupyterLab 大版本变化而变化。较新的运行时通常使用 JupyterLab 4,许多扩展已经改为通过 Python 包分发,旧版本中常见的 `jupyter labextension install ...` 示例不一定仍然适用。 建议先检查当前环境: ```bash jupyter --version jupyter labextension list ``` 如果目标扩展的官方文档明确说明支持当前 JupyterLab 版本,再按对应方式安装。对于 JupyterLab 4,更常见的方式是直接安装对应的 Python 包,例如: ```bash pip install ``` 安装完成后,可以再次执行 `jupyter labextension list` 检查扩展状态。 ![](/img/docs/15582547787148.jpg) --- ## 运行时环境列表(总索引) 目前支持的运行时环境 | framework | name | python | device | uri | |-------------- | -------------- | -------------- | -------------- | -------------- | | pytorch 1.8 | pytorch-1.8.2 | Python 3.6 | CPU / CUDA 10.2 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.8.2-py36-cu102.87 | | pytorch 1.10 | pytorch-1.10.2 | Python 3.8 | CPU / CUDA 11.3 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.10.2-py38-cu113.87 | | pytorch 1.11.0 | pytorch-1.11.0 | Python 3.8 | CPU / CUDA 11.3 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.11.0-py38-cu113.87 | | pytorch 1.12.1 | pytorch-1.12.1 | Python 3.8 | CPU / CUDA 11.3 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.12.1-py38-cu113.94 | | pytorch 1.13.1 | pytorch-1.13.1 | Python 3.8 | CPU / CUDA 11.7 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.13.1-py38-cu117.101 | | pytorch 2.0-cu117 | pytorch-2.0.0 | Python 3.8 | CPU / CUDA 11.7 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:2.0.0-py38-cu117.94 | | pytorch 2.0 | pytorch-2.0.1 | Python 3.8 | CPU / CUDA 11.8 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:2.0.1-py38-cu118.101 | | pytorch 2.1 | pytorch-2.1.0 | Python 3.10 | CPU / CUDA 12.1 | uhub.service.ucloud.cn/openbayesruntimes/pytorch:2.1.0-py310-cu121.101 | | tensorflow 1.15 | tensorflow-1.15.0 | Python 3.6 | CPU | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:1.15.0-py36-cpu.62 | | tensorflow 1.15 | tensorflow-1.15.0 | Python 3.6 | CUDA 10.0 | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:1.15.0-py36-cu100.6 | tensorflow 2.2.0 | tensorflow-2.2.0 | Python 3.6 | CPU | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:2.2.0-py36-cpu.62 | | tensorflow 2.2.0 | tensorflow-2.2.0 | Python 3.6 | CUDA 10.1 | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:2.2.0-py36-cu101.62 | | tensorflow 2.7.1 | tensorflow-2.7.1 | Python 3.8 | CPU / CUDA 11.3 | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:2.7.1-py38-cu113.94 | | tensorflow 2.8.2 | tensorflow-2.8.2 | Python 3.8 | CPU / CUDA 11.3 | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:2.8.2-py38-cu113.94 | | tensorflow 2.12.0 | tensorflow-2.12.0 | Python 3.8 | CPU / CUDA 11.8 | uhub.service.ucloud.cn/openbayesruntimes/tensorflow:2.12.0-py38-cu118.101 | | paddle 2.5 | paddle-2.5.2 | Python 3.8 | CPU / CUDA 11.8 | uhub.service.ucloud.cn/openbayesruntimes/paddle:2.5.2-py38-cu118.101 | --- ## paddle:2.5.2-py38-cu118 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 2.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi aiofiles 22.1.0 pypi_0 pypi aiohttp 3.8.6 pypi_0 pypi aiosignal 1.3.1 pypi_0 pypi aiosqlite 0.19.0 pypi_0 pypi altair 5.1.2 pypi_0 pypi annotated-types 0.6.0 pypi_0 pypi anyio 3.7.1 pypi_0 pypi archspec 0.2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi astor 0.8.1 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi async-timeout 4.0.3 pypi_0 pypi attrdict 2.0.1 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.1 pypi_0 pypi babel 2.13.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi bce-python-sdk 0.8.96 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi boltons 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main boost 1.82.0 py38h06a4308_2 anaconda brotli-python 1.0.9 py38h6a678d5_7 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 https://repo.anaconda.com/pkgs/main c-ares 1.19.1 h5eee18b_0 https://repo.anaconda.com/pkgs/main ca-certificates 2023.08.22 h06a4308_0 https://repo.anaconda.com/pkgs/main cachetools 4.2.4 pypi_0 pypi certifi 2023.7.22 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.7 pypi_0 pypi cloudpickle 3.0.0 pypi_0 pypi colorama 0.4.6 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi colorlog 6.7.0 pypi_0 pypi comm 0.2.0 pypi_0 pypi conda 23.10.0 py38h06a4308_0 anaconda conda-content-trust 0.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-libmamba-solver 23.11.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.9.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.1.1 pypi_0 pypi cryptography 41.0.3 py38hdda0065_0 https://repo.anaconda.com/pkgs/main cssselect 1.2.0 pypi_0 pypi cssutils 2.9.0 pypi_0 pypi cycler 0.12.1 pypi_0 pypi cython 3.0.5 pypi_0 pypi datasets 2.15.0 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dill 0.3.4 pypi_0 pypi dlib 19.24.2 py38h28258f8_2 conda-forge entrypoints 0.4 pypi_0 pypi enum34 1.1.10 pypi_0 pypi et-xmlfile 1.1.0 pypi_0 pypi exceptiongroup 1.1.3 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastapi 0.104.1 pypi_0 pypi fastjsonschema 2.19.0 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi filelock 3.13.1 pypi_0 pypi fire 0.5.0 pypi_0 pypi flask 3.0.0 pypi_0 pypi flask-babel 4.0.0 pypi_0 pypi flask-cors 4.0.0 pypi_0 pypi flatbuffers 23.5.26 pypi_0 pypi fmt 9.1.0 hdb19cb5_0 https://repo.anaconda.com/pkgs/main fonttools 4.44.1 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi frozenlist 1.4.0 pypi_0 pypi fsspec 2023.10.0 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 2.23.4 pypi_0 pypi google-auth-oauthlib 1.0.0 pypi_0 pypi grpcio 1.59.2 pypi_0 pypi h11 0.14.0 pypi_0 pypi httpcore 1.0.2 pypi_0 pypi httptools 0.6.1 pypi_0 pypi httpx 0.25.1 pypi_0 pypi huggingface-hub 0.19.3 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 73.1 h6a678d5_0 https://repo.anaconda.com/pkgs/main idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.32.0 pypi_0 pypi imageio-ffmpeg 0.4.9 pypi_0 pypi imgaug 0.4.0 pypi_0 pypi importlib-metadata 6.8.0 pypi_0 pypi importlib-resources 6.1.1 pypi_0 pypi ipykernel 6.27.0 pypi_0 pypi ipython 8.12.3 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.1.1 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jieba 0.42.1 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.3.2 pypi_0 pypi json5 0.9.14 pypi_0 pypi jsonpatch 1.32 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonpointer 2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonschema 4.20.0 pypi_0 pypi jsonschema-specifications 2023.11.1 pypi_0 pypi jupyter-archive 3.4.0 pypi_0 pypi jupyter-client 7.4.9 pypi_0 pypi jupyter-core 5.5.0 pypi_0 pypi jupyter-events 0.9.0 pypi_0 pypi jupyter-server 2.11.0 pypi_0 pypi jupyter-server-fileid 0.9.0 pypi_0 pypi jupyter-server-terminals 0.4.4 pypi_0 pypi jupyter-server-ydoc 0.8.0 pypi_0 pypi jupyter-ydoc 0.2.5 pypi_0 pypi jupyterlab 3.6.5 pypi_0 pypi jupyterlab-colab-bridge 0.1.6 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 4.0.post5 pypi_0 pypi jupyterlab-notifications 0.5.0 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.25.2 pypi_0 pypi jupyterlab-widgets 3.0.9 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi krb5 1.20.1 h143b758_1 https://repo.anaconda.com/pkgs/main lazy-loader 0.3 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libarchive 3.6.2 h6ac8c49_2 https://repo.anaconda.com/pkgs/main libblas 3.9.0 19_linux64_openblas conda-forge libboost 1.82.0 h109eef0_2 anaconda libcblas 3.9.0 19_linux64_openblas conda-forge libcurl 8.4.0 h251f7ec_0 https://repo.anaconda.com/pkgs/main libedit 3.1.20221030 h5eee18b_0 https://repo.anaconda.com/pkgs/main libev 4.33 h7f8727e_1 https://repo.anaconda.com/pkgs/main libffi 3.4.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 19_linux64_openblas conda-forge libmamba 1.5.3 haf1ee3a_0 https://repo.anaconda.com/pkgs/main libmambapy 1.5.3 py38h2dafd23_0 https://repo.anaconda.com/pkgs/main libnghttp2 1.57.0 h2d74bed_0 https://repo.anaconda.com/pkgs/main libopenblas 0.3.24 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge librosa 0.10.1 pypi_0 pypi libsolv 0.7.24 he621ea3_0 https://repo.anaconda.com/pkgs/main libsqlite 3.44.0 h2797004_0 conda-forge libssh2 1.10.0 hdbd6064_2 https://repo.anaconda.com/pkgs/main libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libxml2 2.10.4 hf1b16e4_1 https://repo.anaconda.com/pkgs/main libzlib 1.2.13 hd590300_5 conda-forge llvmlite 0.41.1 pypi_0 pypi lmdb 1.4.1 pypi_0 pypi lxml 4.9.3 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main markdown 3.5.1 pypi_0 pypi markdown-it-py 3.0.0 pypi_0 pypi markupsafe 2.1.3 pypi_0 pypi matplotlib 3.7.3 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mdurl 0.1.2 pypi_0 pypi mistune 3.0.2 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.7 pypi_0 pypi multidict 6.0.4 pypi_0 pypi multiprocess 0.70.12.2 pypi_0 pypi nbclassic 1.0.0 pypi_0 pypi nbclient 0.9.0 pypi_0 pypi nbconvert 7.11.0 pypi_0 pypi nbformat 5.9.2 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.8 pypi_0 pypi networkx 3.1 pypi_0 pypi notebook 6.5.6 pypi_0 pypi notebook-shim 0.2.3 pypi_0 pypi numba 0.58.1 pypi_0 pypi numpy 1.24.4 py38h59b608b_0 conda-forge oauthlib 3.2.2 pypi_0 pypi onnx 1.15.0 pypi_0 pypi onnxruntime 1.16.2 pypi_0 pypi openbayes-serving 0.3.1 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-contrib-python 4.6.0.66 pypi_0 pypi opencv-python 4.6.0.66 pypi_0 pypi openpyxl 3.1.2 pypi_0 pypi openssl 3.1.4 hd590300_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi overrides 7.4.0 pypi_0 pypi packaging 23.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main paddle2onnx 1.1.0 pypi_0 pypi paddlefsl 1.1.0 pypi_0 pypi paddlenlp 2.6.1 pypi_0 pypi paddleocr 2.7.0.3 pypi_0 pypi paddlepaddle-gpu 2.5.2 pypi_0 pypi pandas 2.0.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.5.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pcre2 10.42 hebb0a14_0 https://repo.anaconda.com/pkgs/main pdf2docx 0.5.6 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 10.0.1 pypi_0 pypi pip 23.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 4.0.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.8.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi premailer 3.10.0 pypi_0 pypi prometheus-client 0.19.0 pypi_0 pypi prompt-toolkit 3.0.41 pypi_0 pypi protobuf 3.20.2 pypi_0 pypi psutil 5.9.6 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.82.0 py38h3c18c91_2 anaconda pyarrow 14.0.1 pypi_0 pypi pyarrow-hotfix 0.5 pypi_0 pypi pyasn1 0.5.0 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pybind11-abi 4 hd3eb1b0_1 https://repo.anaconda.com/pkgs/main pyclipper 1.3.0.post5 pypi_0 pypi pycosat 0.6.6 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pycryptodome 3.19.0 pypi_0 pypi pydantic 2.5.1 pypi_0 pypi pydantic-core 2.14.3 pypi_0 pypi pygments 2.16.1 pypi_0 pypi pymupdf 1.20.2 pypi_0 pypi pyopenssl 23.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.1.1 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.18 h955ad1f_0 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-docx 1.1.0 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2023.3.post1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 24.0.1 pypi_0 pypi rapidfuzz 3.5.2 pypi_0 pypi rarfile 4.1 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main referencing 0.31.0 pypi_0 pypi reproc 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main reproc-cpp 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main requests 2.31.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rich 13.7.0 pypi_0 pypi rpds-py 0.13.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main safetensors 0.4.0 pypi_0 pypi scikit-image 0.21.0 pypi_0 pypi scikit-learn 1.3.2 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.13.0 pypi_0 pypi send2trash 1.8.2 pypi_0 pypi sentencepiece 0.1.99 pypi_0 pypi seqeval 1.2.2 pypi_0 pypi setuptools 68.2.2 pypi_0 pypi shapely 2.0.2 pypi_0 pypi six 1.16.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.5 pypi_0 pypi soxr 0.3.7 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.3 pypi_0 pypi starlette 0.27.0 pypi_0 pypi sympy 1.12 pypi_0 pypi tenacity 8.2.3 pypi_0 pypi tensorboard 2.14.0 pypi_0 pypi tensorboard-data-server 0.7.2 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi termcolor 2.3.0 pypi_0 pypi terminado 0.18.0 pypi_0 pypi threadpoolctl 3.2.0 pypi_0 pypi tifffile 2023.7.10 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main tomli 2.0.1 pypi_0 pypi toolz 0.12.0 pypi_0 pypi tornado 6.3.3 pypi_0 pypi tqdm 4.65.0 py38hb070fc8_0 https://repo.anaconda.com/pkgs/main traitlets 5.13.0 pypi_0 pypi typer 0.9.0 pypi_0 pypi types-python-dateutil 2.8.19.14 pypi_0 pypi typing-extensions 4.8.0 pypi_0 pypi tzdata 2023.3 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.24.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi visualdl 2.5.3 pypi_0 pypi wcwidth 0.2.12 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.6.4 pypi_0 pypi werkzeug 3.0.1 pypi_0 pypi wheel 0.41.3 pypi_0 pypi widgetsnbextension 4.0.9 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xxhash 3.4.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main y-py 0.6.2 pypi_0 pypi yaml-cpp 0.8.0 h6a678d5_0 https://repo.anaconda.com/pkgs/main yarl 1.9.2 pypi_0 pypi ypy-websocket 0.8.4 pypi_0 pypi zipp 3.17.0 pypi_0 pypi zlib 1.2.13 hd590300_5 conda-forge zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.5 hc292b87_0 https://repo.anaconda.com/pkgs/main ``` --- ## pytorch:1.10.2-py38-cu113 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main defaults _openmp_mutex 4.5 1_gnu defaults absl-py 1.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi altair 4.2.0 pypi_0 pypi anyio 3.5.0 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asgiref 3.5.0 pypi_0 pypi asttokens 2.0.5 pypi_0 pypi attrs 21.4.0 pyhd8ed1ab_0 conda-forge babel 2.9.1 pypi_0 pypi backcall 0.2.0 pyh9f0ad1d_0 conda-forge backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge black 21.12b0 pypi_0 pypi bleach 4.1.0 pyhd8ed1ab_0 conda-forge boost 1.73.0 py38_11 https://conda.anaconda.org/anaconda brotlipy 0.7.0 py38h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2021.10.8 ha878542_0 conda-forge cachetools 4.2.4 pypi_0 pypi certifi 2021.10.8 py38h578d9bd_1 conda-forge cffi 1.14.6 py38h400218f_0 defaults charset-normalizer 2.0.4 pyhd3eb1b0_0 defaults click 8.0.3 pypi_0 pypi cloudpickle 2.0.0 pypi_0 pypi conda 4.11.0 py38h578d9bd_0 conda-forge conda-package-handling 1.7.3 py38h27cfd23_1 defaults cryptography 36.0.0 py38h9ce1e76_0 defaults cycler 0.11.0 pypi_0 pypi cython 0.29.26 pypi_0 pypi debugpy 1.5.1 pypi_0 pypi decorator 5.1.1 pyhd8ed1ab_0 conda-forge defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.22.0 py38h5ef3938_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi executing 0.8.2 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 2.0.2 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 2.0 pypi_0 pypi fonttools 4.28.5 pypi_0 pypi future 0.18.2 pypi_0 pypi google-auth 1.35.0 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi grpcio 1.43.0 pypi_0 pypi h11 0.13.0 pypi_0 pypi horovod 0.23.0 pypi_0 pypi httptools 0.3.0 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 3.3 pyhd3eb1b0_0 defaults imageio 2.13.3 pypi_0 pypi imageio-ffmpeg 0.4.5 pypi_0 pypi importlib-metadata 4.10.1 py38h578d9bd_0 conda-forge importlib_resources 5.4.0 pyhd8ed1ab_0 conda-forge install 1.3.5 pypi_0 pypi ipykernel 6.7.0 pypi_0 pypi ipython 8.0.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.5 pyhd8ed1ab_0 conda-forge itsdangerous 2.0.1 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 3.0.3 pyhd8ed1ab_0 conda-forge joblib 1.1.0 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.6 pypi_0 pypi jsonschema 4.4.0 pyhd8ed1ab_0 conda-forge jupyter-archive 3.2.1 pypi_0 pypi jupyter-server 1.13.4 pypi_0 pypi jupyter_client 7.1.2 pyhd8ed1ab_0 conda-forge jupyter_core 4.9.1 py38h578d9bd_1 conda-forge jupyterlab 3.1.19 pypi_0 pypi jupyterlab-execute-time 2.1.0 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.2.post7 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.1.2 pypi_0 pypi jupyterlab-server 2.10.3 pypi_0 pypi jupyterlab_widgets 1.0.2 pyhd8ed1ab_0 conda-forge kiwisolver 1.3.2 pypi_0 pypi ld_impl_linux-64 2.35.1 h7274673_9 defaults libblas 3.9.0 11_linux64_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 11_linux64_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h5101ec6_17 defaults libgfortran-ng 11.2.0 h69a702a_11 conda-forge libgfortran5 11.2.0 h5c6108e_11 conda-forge libgomp 9.3.0 h5101ec6_17 defaults liblapack 3.9.0 11_linux64_openblas conda-forge libopenblas 0.3.17 pthreads_h8fe5266_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 hd4cf53a_17 defaults lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.6 pypi_0 pypi markupsafe 2.0.1 py38h497a2fe_0 conda-forge matplotlib 3.5.1 pypi_0 pypi matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge mistune 0.8.4 py38h497a2fe_1004 conda-forge mmcv-full 1.4.1 pypi_0 pypi msgpack 1.0.3 pypi_0 pypi mypy-extensions 0.4.3 pypi_0 pypi nbclassic 0.3.5 pypi_0 pypi nbclient 0.5.10 pypi_0 pypi nbconvert 6.4.1 pypi_0 pypi nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.3 h7f8727e_2 defaults nest-asyncio 1.5.4 pyhd8ed1ab_0 conda-forge networkx 2.6.3 pypi_0 pypi notebook 6.4.8 pypi_0 pypi numpy 1.22.1 pypi_0 pypi oauthlib 3.1.1 pypi_0 pypi onnx 1.10.2 pypi_0 pypi onnxruntime 1.10.0 pypi_0 pypi openbayes-serving 0.1.17 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1m h7f8727e_0 defaults packaging 21.3 pyhd8ed1ab_0 conda-forge pandas 1.3.5 pypi_0 pypi pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge parso 0.7.1 pypi_0 pypi pathspec 0.9.0 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 8.4.0 pypi_0 pypi pip 21.2.4 py38h06a4308_0 defaults platformdirs 2.4.1 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus_client 0.13.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.26 pypi_0 pypi protobuf 3.19.3 pypi_0 pypi psutil 5.9.0 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py38h7b6447c_1 defaults pycparser 2.21 pyhd3eb1b0_0 defaults pygments 2.11.2 pyhd8ed1ab_0 conda-forge pyopenssl 21.0.0 pyhd3eb1b0_1 defaults pyparsing 3.0.6 pypi_0 pypi pyrsistent 0.18.1 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 defaults python 3.8.12 h12debd9_0 defaults python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge python-graphviz 0.19.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2021.3 pypi_0 pypi pywavelets 1.2.0 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 22.3.0 pypi_0 pypi readline 8.1 h27cfd23_0 defaults requests 2.26.0 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi rsa 4.8 pypi_0 pypi ruamel_yaml 0.15.100 py38h27cfd23_0 defaults scikit-image 0.19.1 pypi_0 pypi scikit-learn 1.0.1 pypi_0 pypi scipy 1.7.3 pypi_0 pypi seaborn 0.11.2 pypi_0 pypi send2trash 1.8.0 pyhd8ed1ab_0 conda-forge setuptools 60.0.0 pypi_0 pypi six 1.16.0 pyhd3eb1b0_0 defaults sniffio 1.2.0 pypi_0 pypi sqlite 3.36.0 hc218d9a_0 defaults stack-data 0.1.4 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi terminado 0.13.1 py38h578d9bd_0 conda-forge testpath 0.5.0 pyhd8ed1ab_0 conda-forge threadpoolctl 3.0.0 pypi_0 pypi tifffile 2021.11.2 pypi_0 pypi tk 8.6.11 h1ccaba5_0 defaults tomli 1.2.3 pypi_0 pypi toolz 0.11.2 pypi_0 pypi torch 1.10.2+cu113 pypi_0 pypi torch-tb-profiler 0.3.1 pypi_0 pypi torchvision 0.11.3+cu113 pypi_0 pypi tornado 6.1 py38h497a2fe_1 conda-forge tqdm 4.62.3 pyhd3eb1b0_1 defaults traitlets 5.1.1 pyhd8ed1ab_0 conda-forge typing 3.7.4.3 pypi_0 pypi typing-extensions 4.0.1 pypi_0 pypi urllib3 1.26.7 pyhd3eb1b0_0 defaults uvicorn 0.17.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi websocket-client 1.2.3 pypi_0 pypi werkzeug 2.0.2 pypi_0 pypi wheel 0.37.0 pyhd3eb1b0_1 defaults widgetsnbextension 3.5.2 py38h578d9bd_1 conda-forge xgboost 1.5.1 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults yapf 0.32.0 pypi_0 pypi zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.7.0 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7f8727e_4 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## pytorch:1.11.0-py38-cu113 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main https://repo.anaconda.com/pkgs/main _openmp_mutex 5.1 1_gnu https://repo.anaconda.com/pkgs/main absl-py 1.4.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi altair 4.2.2 pypi_0 pypi ansiwrap 0.8.4 pypi_0 pypi anyio 3.6.2 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asttokens 2.2.1 pypi_0 pypi attrs 22.2.0 pypi_0 pypi audioread 3.0.0 pypi_0 pypi babel 2.12.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.11.2 pypi_0 pypi bleach 6.0.0 pypi_0 pypi boost 1.73.0 py38h06a4308_12 anaconda brotlipy 0.7.0 py38h27cfd23_1003 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 anaconda ca-certificates 2023.01.10 h06a4308_0 anaconda cachetools 4.2.4 pypi_0 pypi certifi 2022.12.7 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.3 pypi_0 pypi cloudpickle 2.2.1 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi comm 0.1.2 pypi_0 pypi conda 23.1.0 py38h06a4308_0 anaconda conda-content-trust 0.1.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.0.2 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.7.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.0.7 pypi_0 pypi cryptography 39.0.1 py38h9ce1e76_0 https://repo.anaconda.com/pkgs/main cycler 0.11.0 pypi_0 pypi cython 0.29.33 pypi_0 pypi debugpy 1.6.6 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.0 py38he2161a6_0 conda-forge entrypoints 0.4 pypi_0 pypi executing 1.2.0 pypi_0 pypi fastjsonschema 2.16.3 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 2.2.3 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 23.3.3 pypi_0 pypi fonttools 4.39.0 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 1.35.0 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi grpcio 1.51.3 pypi_0 pypi h11 0.14.0 pypi_0 pypi horovod 0.27.0 pypi_0 pypi httptools 0.5.0 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 58.2 he6710b0_3 anaconda idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.26.0 pypi_0 pypi imageio-ffmpeg 0.4.8 pypi_0 pypi importlib-metadata 6.0.0 pypi_0 pypi importlib-resources 5.12.0 pypi_0 pypi install 1.3.5 pypi_0 pypi ipykernel 6.21.3 pypi_0 pypi ipython 8.11.0 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.0.4 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.18.2 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.2.0 pypi_0 pypi jpeg 9e h166bdaf_1 conda-forge json5 0.9.11 pypi_0 pypi jsonschema 4.17.3 pypi_0 pypi jupyter-archive 3.3.4 pypi_0 pypi jupyter-client 8.0.3 pypi_0 pypi jupyter-core 5.2.0 pypi_0 pypi jupyter-server 1.23.6 pypi_0 pypi jupyterlab 3.4.3 pypi_0 pypi jupyterlab-colab-bridge 0.1.5 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.6.post0 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.20.0 pypi_0 pypi jupyterlab-widgets 3.0.5 pypi_0 pypi kiwisolver 1.4.4 pypi_0 pypi lazy-loader 0.1 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libblas 3.9.0 15_linux64_openblas conda-forge libboost 1.73.0 h28710b8_12 anaconda libcblas 3.9.0 15_linux64_openblas conda-forge libffi 3.4.2 h6a678d5_6 https://repo.anaconda.com/pkgs/main libgcc-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main libgfortran-ng 12.2.0 h69a702a_19 conda-forge libgfortran5 12.2.0 h337968e_19 conda-forge libgomp 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main liblapack 3.9.0 15_linux64_openblas conda-forge libopenblas 0.3.20 pthreads_h78a6416_0 conda-forge libpng 1.6.39 h5eee18b_0 https://repo.anaconda.com/pkgs/main librosa 0.10.0 pypi_0 pypi libstdcxx-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main lightgbm 2.3.1 pypi_0 pypi llvmlite 0.39.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 anaconda markdown 3.4.1 pypi_0 pypi markupsafe 2.1.2 pypi_0 pypi matplotlib 3.7.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 2.0.5 pypi_0 pypi mmcls 0.23.1 pypi_0 pypi mmcv-full 1.5.3 pypi_0 pypi mmdet 2.25.0 pypi_0 pypi mmsegmentation 0.26.0 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.4 pypi_0 pypi nbclassic 0.5.3 pypi_0 pypi nbclient 0.7.2 pypi_0 pypi nbconvert 7.2.9 pypi_0 pypi nbformat 5.7.3 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.6 pypi_0 pypi networkx 3.0 pypi_0 pypi notebook-shim 0.2.2 pypi_0 pypi numba 0.56.4 pypi_0 pypi numpy 1.23.5 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi onnx 1.13.1 pypi_0 pypi onnxruntime 1.14.1 pypi_0 pypi openbayes-serving 0.2.5 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1t h7f8727e_0 https://repo.anaconda.com/pkgs/main packaging 23.0 pypi_0 pypi pandas 1.5.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.4.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 9.4.0 pypi_0 pypi pip 23.0.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 3.1.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.7.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prettytable 3.6.0 pypi_0 pypi prometheus-client 0.16.0 pypi_0 pypi prompt-toolkit 3.0.38 pypi_0 pypi protobuf 3.20.3 pypi_0 pypi psutil 5.9.4 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h51133e4_12 anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycocotools 2.0.6 pypi_0 pypi pycosat 0.6.4 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.14.0 pypi_0 pypi pyopenssl 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.0.9 pypi_0 pypi pyrsistent 0.19.3 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.16 h7a1cb2a_3 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2022.7.1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 25.0.0 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main requests 2.28.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.20.0 pypi_0 pypi scikit-learn 1.2.1 pypi_0 pypi scipy 1.9.1 pypi_0 pypi seaborn 0.12.2 pypi_0 pypi send2trash 1.8.0 pypi_0 pypi setuptools 67.5.1 pypi_0 pypi six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.4 pypi_0 pypi soxr 0.3.4 pypi_0 pypi sqlite 3.40.1 h5082296_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.2 pypi_0 pypi sympy 1.11.1 pypi_0 pypi tenacity 8.2.2 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi terminado 0.17.1 pypi_0 pypi terminaltables 3.1.10 pypi_0 pypi textwrap3 0.9.2 pypi_0 pypi threadpoolctl 3.1.0 pypi_0 pypi tifffile 2023.2.28 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main toolz 0.12.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main torch 1.11.0+cu113 pypi_0 pypi torch-tb-profiler 0.4.1 pypi_0 pypi torchaudio 0.11.0+cu113 pypi_0 pypi torchvision 0.12.0+cu113 pypi_0 pypi tornado 6.2 pypi_0 pypi tqdm 4.64.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main traitlets 5.9.0 pypi_0 pypi typing-extensions 4.5.0 pypi_0 pypi urllib3 1.26.14 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.20.0 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.6 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.5.1 pypi_0 pypi werkzeug 2.2.3 pypi_0 pypi wheel 0.38.4 pypi_0 pypi widgetsnbextension 4.0.5 pypi_0 pypi xgboost 1.7.4 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.10 h5eee18b_1 https://repo.anaconda.com/pkgs/main yapf 0.32.0 pypi_0 pypi zipp 3.15.0 pypi_0 pypi zlib 1.2.13 h5eee18b_0 https://repo.anaconda.com/pkgs/main zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.2 ha4553b6_0 anaconda ``` --- ## pytorch:1.12.1-py38-cu113 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main https://repo.anaconda.com/pkgs/main _openmp_mutex 5.1 1_gnu https://repo.anaconda.com/pkgs/main absl-py 1.4.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi aiohttp 3.8.4 pypi_0 pypi aiohttp-cors 0.7.0 pypi_0 pypi aiosignal 1.3.1 pypi_0 pypi altair 4.2.2 pypi_0 pypi ansiwrap 0.8.4 pypi_0 pypi anyio 3.6.2 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asttokens 2.2.1 pypi_0 pypi async-timeout 4.0.2 pypi_0 pypi attrs 22.2.0 pypi_0 pypi audioread 3.0.0 pypi_0 pypi babel 2.12.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.11.2 pypi_0 pypi bleach 6.0.0 pypi_0 pypi blessed 1.20.0 pypi_0 pypi boost 1.73.0 py38h06a4308_12 anaconda brotlipy 0.7.0 py38h27cfd23_1003 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 anaconda ca-certificates 2023.01.10 h06a4308_0 anaconda cachetools 4.2.4 pypi_0 pypi certifi 2022.12.7 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.3 pypi_0 pypi cloudpickle 2.2.1 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi colorful 0.5.5 pypi_0 pypi comm 0.1.2 pypi_0 pypi conda 23.1.0 py38h06a4308_0 anaconda conda-content-trust 0.1.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.0.2 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.7.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.0.7 pypi_0 pypi cryptography 39.0.1 py38h9ce1e76_0 https://repo.anaconda.com/pkgs/main cycler 0.11.0 pypi_0 pypi cython 0.29.33 pypi_0 pypi debugpy 1.6.6 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi distlib 0.3.6 pypi_0 pypi dlib 19.24.0 py38he2161a6_0 conda-forge entrypoints 0.4 pypi_0 pypi executing 1.2.0 pypi_0 pypi fastjsonschema 2.16.3 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi filelock 3.9.0 pypi_0 pypi flask 2.2.3 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 23.3.3 pypi_0 pypi fonttools 4.39.0 pypi_0 pypi frozenlist 1.3.3 pypi_0 pypi future 0.18.3 pypi_0 pypi google-api-core 2.11.0 pypi_0 pypi google-auth 2.16.2 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi googleapis-common-protos 1.58.0 pypi_0 pypi gpustat 1.0.0 pypi_0 pypi grpcio 1.51.3 pypi_0 pypi h11 0.14.0 pypi_0 pypi horovod 0.27.0 pypi_0 pypi httptools 0.5.0 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 58.2 he6710b0_3 anaconda idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.26.0 pypi_0 pypi imageio-ffmpeg 0.4.8 pypi_0 pypi importlib-metadata 6.0.0 pypi_0 pypi importlib-resources 5.12.0 pypi_0 pypi install 1.3.5 pypi_0 pypi ipykernel 6.21.3 pypi_0 pypi ipython 8.11.0 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.0.4 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.18.2 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.2.0 pypi_0 pypi jpeg 9e h166bdaf_1 conda-forge json5 0.9.11 pypi_0 pypi jsonschema 4.17.3 pypi_0 pypi jupyter-archive 3.3.4 pypi_0 pypi jupyter-client 8.0.3 pypi_0 pypi jupyter-core 5.2.0 pypi_0 pypi jupyter-server 1.23.6 pypi_0 pypi jupyterlab 3.4.3 pypi_0 pypi jupyterlab-colab-bridge 0.1.5 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.6.post0 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.20.0 pypi_0 pypi jupyterlab-widgets 3.0.5 pypi_0 pypi kiwisolver 1.4.4 pypi_0 pypi lazy-loader 0.1 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libblas 3.9.0 15_linux64_openblas conda-forge libboost 1.73.0 h28710b8_12 anaconda libcblas 3.9.0 15_linux64_openblas conda-forge libffi 3.4.2 h6a678d5_6 https://repo.anaconda.com/pkgs/main libgcc-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main libgfortran-ng 12.2.0 h69a702a_19 conda-forge libgfortran5 12.2.0 h337968e_19 conda-forge libgomp 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main liblapack 3.9.0 15_linux64_openblas conda-forge libopenblas 0.3.20 pthreads_h78a6416_0 conda-forge libpng 1.6.39 h5eee18b_0 https://repo.anaconda.com/pkgs/main librosa 0.10.0 pypi_0 pypi libstdcxx-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main lightgbm 2.3.1 pypi_0 pypi llvmlite 0.39.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 anaconda markdown 3.4.1 pypi_0 pypi markupsafe 2.1.2 pypi_0 pypi matplotlib 3.7.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 2.0.5 pypi_0 pypi mmcls 0.24.0 pypi_0 pypi mmcv-full 1.6.2 pypi_0 pypi mmdet 2.25.3 pypi_0 pypi mmsegmentation 0.29.0 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.4 pypi_0 pypi multidict 6.0.4 pypi_0 pypi nbclassic 0.5.3 pypi_0 pypi nbclient 0.7.2 pypi_0 pypi nbconvert 7.2.9 pypi_0 pypi nbformat 5.7.3 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.6 pypi_0 pypi networkx 3.0 pypi_0 pypi notebook-shim 0.2.2 pypi_0 pypi numba 0.56.4 pypi_0 pypi numpy 1.23.5 pypi_0 pypi nvidia-ml-py 11.495.46 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi onnx 1.13.1 pypi_0 pypi onnxruntime 1.14.1 pypi_0 pypi openbayes-serving 0.2.5 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencensus 0.11.1 pypi_0 pypi opencensus-context 0.1.3 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1t h7f8727e_0 https://repo.anaconda.com/pkgs/main packaging 23.0 pypi_0 pypi pandas 1.5.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.4.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 9.4.0 pypi_0 pypi pip 23.0.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 3.1.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.7.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prettytable 3.6.0 pypi_0 pypi prometheus-client 0.16.0 pypi_0 pypi prompt-toolkit 3.0.38 pypi_0 pypi protobuf 3.20.3 pypi_0 pypi psutil 5.9.4 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h51133e4_12 anaconda py-spy 0.3.14 pypi_0 pypi pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycocotools 2.0.6 pypi_0 pypi pycosat 0.6.4 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pydantic 1.10.5 pypi_0 pypi pygments 2.14.0 pypi_0 pypi pyopenssl 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.0.9 pypi_0 pypi pyrsistent 0.19.3 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.16 h7a1cb2a_3 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2022.7.1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 25.0.0 pypi_0 pypi ray 2.3.0 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main requests 2.28.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.20.0 pypi_0 pypi scikit-learn 1.2.1 pypi_0 pypi scipy 1.9.1 pypi_0 pypi seaborn 0.12.2 pypi_0 pypi send2trash 1.8.0 pypi_0 pypi setuptools 67.5.1 pypi_0 pypi six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main smart-open 6.3.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.4 pypi_0 pypi soxr 0.3.4 pypi_0 pypi sqlite 3.40.1 h5082296_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.2 pypi_0 pypi sympy 1.11.1 pypi_0 pypi tenacity 8.2.2 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi terminado 0.17.1 pypi_0 pypi terminaltables 3.1.10 pypi_0 pypi textwrap3 0.9.2 pypi_0 pypi threadpoolctl 3.1.0 pypi_0 pypi tifffile 2023.2.28 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main toolz 0.12.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main torch 1.12.1+cu113 pypi_0 pypi torch-tb-profiler 0.4.1 pypi_0 pypi torchaudio 0.12.1+cu113 pypi_0 pypi torchvision 0.13.1+cu113 pypi_0 pypi tornado 6.2 pypi_0 pypi tqdm 4.64.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main traitlets 5.9.0 pypi_0 pypi typing-extensions 4.5.0 pypi_0 pypi urllib3 1.26.14 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.20.0 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi virtualenv 20.20.0 pypi_0 pypi wcwidth 0.2.6 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.5.1 pypi_0 pypi werkzeug 2.2.3 pypi_0 pypi wheel 0.38.4 pypi_0 pypi widgetsnbextension 4.0.5 pypi_0 pypi xgboost 1.7.4 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.10 h5eee18b_1 https://repo.anaconda.com/pkgs/main yapf 0.32.0 pypi_0 pypi yarl 1.8.2 pypi_0 pypi zipp 3.15.0 pypi_0 pypi zlib 1.2.13 h5eee18b_0 https://repo.anaconda.com/pkgs/main zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.2 ha4553b6_0 anaconda ``` --- ## pytorch:1.13.1-py38-cu117 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 2.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi aiofiles 22.1.0 pypi_0 pypi aiosqlite 0.19.0 pypi_0 pypi altair 5.1.2 pypi_0 pypi anyio 4.0.0 pypi_0 pypi archspec 0.2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.1 pypi_0 pypi babel 2.13.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi boltons 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main boost 1.82.0 py38h06a4308_2 anaconda brotli-python 1.0.9 py38h6a678d5_7 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 https://repo.anaconda.com/pkgs/main c-ares 1.19.1 h5eee18b_0 https://repo.anaconda.com/pkgs/main ca-certificates 2023.08.22 h06a4308_0 https://repo.anaconda.com/pkgs/main cachetools 4.2.4 pypi_0 pypi certifi 2023.7.22 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.7 pypi_0 pypi cloudpickle 3.0.0 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi comm 0.2.0 pypi_0 pypi conda 23.10.0 py38h06a4308_0 anaconda conda-content-trust 0.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-libmamba-solver 23.11.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.9.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.1.1 pypi_0 pypi cryptography 41.0.3 py38hdda0065_0 https://repo.anaconda.com/pkgs/main cycler 0.12.1 pypi_0 pypi cython 3.0.5 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.2 py38h28258f8_2 conda-forge entrypoints 0.4 pypi_0 pypi exceptiongroup 1.1.3 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastjsonschema 2.19.0 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 3.0.0 pypi_0 pypi flask-cors 4.0.0 pypi_0 pypi flatbuffers 23.5.26 pypi_0 pypi fmt 9.1.0 hdb19cb5_0 https://repo.anaconda.com/pkgs/main fonttools 4.44.1 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 1.35.0 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi grpcio 1.59.2 pypi_0 pypi h11 0.14.0 pypi_0 pypi httptools 0.6.1 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 73.1 h6a678d5_0 https://repo.anaconda.com/pkgs/main idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.32.0 pypi_0 pypi imageio-ffmpeg 0.4.9 pypi_0 pypi importlib-metadata 6.8.0 pypi_0 pypi importlib-resources 6.1.1 pypi_0 pypi ipykernel 6.26.0 pypi_0 pypi ipython 8.12.3 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.1.1 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.3.2 pypi_0 pypi json5 0.9.14 pypi_0 pypi jsonpatch 1.32 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonpointer 2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonschema 4.19.2 pypi_0 pypi jsonschema-specifications 2023.11.1 pypi_0 pypi jupyter-archive 3.4.0 pypi_0 pypi jupyter-client 7.4.9 pypi_0 pypi jupyter-core 5.5.0 pypi_0 pypi jupyter-events 0.9.0 pypi_0 pypi jupyter-server 2.10.1 pypi_0 pypi jupyter-server-fileid 0.9.0 pypi_0 pypi jupyter-server-terminals 0.4.4 pypi_0 pypi jupyter-server-ydoc 0.8.0 pypi_0 pypi jupyter-ydoc 0.2.5 pypi_0 pypi jupyterlab 3.6.5 pypi_0 pypi jupyterlab-colab-bridge 0.1.6 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 4.0.post5 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.25.1 pypi_0 pypi jupyterlab-widgets 3.0.9 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi krb5 1.20.1 h143b758_1 https://repo.anaconda.com/pkgs/main lazy-loader 0.3 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libarchive 3.6.2 h6ac8c49_2 https://repo.anaconda.com/pkgs/main libblas 3.9.0 19_linux64_openblas conda-forge libboost 1.82.0 h109eef0_2 anaconda libcblas 3.9.0 19_linux64_openblas conda-forge libcurl 8.4.0 h251f7ec_0 https://repo.anaconda.com/pkgs/main libedit 3.1.20221030 h5eee18b_0 https://repo.anaconda.com/pkgs/main libev 4.33 h7f8727e_1 https://repo.anaconda.com/pkgs/main libffi 3.4.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 19_linux64_openblas conda-forge libmamba 1.5.3 haf1ee3a_0 https://repo.anaconda.com/pkgs/main libmambapy 1.5.3 py38h2dafd23_0 https://repo.anaconda.com/pkgs/main libnghttp2 1.57.0 h2d74bed_0 https://repo.anaconda.com/pkgs/main libopenblas 0.3.24 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge librosa 0.10.1 pypi_0 pypi libsolv 0.7.24 he621ea3_0 https://repo.anaconda.com/pkgs/main libsqlite 3.44.0 h2797004_0 conda-forge libssh2 1.10.0 hdbd6064_2 https://repo.anaconda.com/pkgs/main libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libxml2 2.10.4 hf1b16e4_1 https://repo.anaconda.com/pkgs/main libzlib 1.2.13 hd590300_5 conda-forge llvmlite 0.41.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main markdown 3.5.1 pypi_0 pypi markupsafe 2.1.3 pypi_0 pypi matplotlib 3.7.3 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 3.0.2 pypi_0 pypi mmcls 0.24.0 pypi_0 pypi mmcv-full 1.6.2 pypi_0 pypi mmdet 2.25.3 pypi_0 pypi mmsegmentation 0.29.0 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.7 pypi_0 pypi nbclassic 1.0.0 pypi_0 pypi nbclient 0.9.0 pypi_0 pypi nbconvert 7.11.0 pypi_0 pypi nbformat 5.9.2 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.8 pypi_0 pypi networkx 3.1 pypi_0 pypi notebook 6.5.6 pypi_0 pypi notebook-shim 0.2.3 pypi_0 pypi numba 0.58.1 pypi_0 pypi numpy 1.24.4 py38h59b608b_0 conda-forge oauthlib 3.2.2 pypi_0 pypi onnx 1.15.0 pypi_0 pypi onnxruntime 1.16.2 pypi_0 pypi openbayes-serving 0.3.1 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.8.1.78 pypi_0 pypi openssl 3.1.4 hd590300_0 conda-forge overrides 7.4.0 pypi_0 pypi packaging 23.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pandas 2.0.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.5.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pcre2 10.42 hebb0a14_0 https://repo.anaconda.com/pkgs/main pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 10.1.0 pypi_0 pypi pip 23.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 4.0.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.8.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prettytable 3.9.0 pypi_0 pypi prometheus-client 0.18.0 pypi_0 pypi prompt-toolkit 3.0.41 pypi_0 pypi protobuf 4.25.1 pypi_0 pypi psutil 5.9.6 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.82.0 py38h3c18c91_2 anaconda pyasn1 0.5.0 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pybind11-abi 4 hd3eb1b0_1 https://repo.anaconda.com/pkgs/main pycocotools 2.0.7 pypi_0 pypi pycosat 0.6.6 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.16.1 pypi_0 pypi pyopenssl 23.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.1.1 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.18 h955ad1f_0 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2023.3.post1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 24.0.1 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main referencing 0.31.0 pypi_0 pypi reproc 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main reproc-cpp 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main requests 2.31.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rpds-py 0.12.0 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.21.0 pypi_0 pypi scikit-learn 1.3.2 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.13.0 pypi_0 pypi send2trash 1.8.2 pypi_0 pypi setuptools 68.2.2 pypi_0 pypi six 1.16.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.5 pypi_0 pypi soxr 0.3.7 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.3 pypi_0 pypi sympy 1.12 pypi_0 pypi tenacity 8.2.3 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi terminado 0.18.0 pypi_0 pypi terminaltables 3.1.10 pypi_0 pypi threadpoolctl 3.2.0 pypi_0 pypi tifffile 2023.7.10 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main tomli 2.0.1 pypi_0 pypi toolz 0.12.0 pypi_0 pypi torch 1.13.1+cu117 pypi_0 pypi torch-tb-profiler 0.4.3 pypi_0 pypi torchaudio 0.13.1+cu117 pypi_0 pypi torchvision 0.14.1+cu117 pypi_0 pypi tornado 6.3.3 pypi_0 pypi tqdm 4.65.0 py38hb070fc8_0 https://repo.anaconda.com/pkgs/main traitlets 5.13.0 pypi_0 pypi types-python-dateutil 2.8.19.14 pypi_0 pypi typing-extensions 4.8.0 pypi_0 pypi tzdata 2023.3 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.24.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.10 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.6.4 pypi_0 pypi werkzeug 3.0.1 pypi_0 pypi wheel 0.41.3 pypi_0 pypi widgetsnbextension 4.0.9 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main y-py 0.6.2 pypi_0 pypi yaml-cpp 0.8.0 h6a678d5_0 https://repo.anaconda.com/pkgs/main yapf 0.40.2 pypi_0 pypi ypy-websocket 0.8.4 pypi_0 pypi zipp 3.17.0 pypi_0 pypi zlib 1.2.13 hd590300_5 conda-forge zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.5 hc292b87_0 https://repo.anaconda.com/pkgs/main ``` --- ## pytorch:1.8.2-py36-cu102 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main defaults _openmp_mutex 4.5 1_gnu defaults absl-py 0.13.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi altair 4.1.0 pypi_0 pypi anyio 3.3.0 pypi_0 pypi argon2-cffi 21.1.0 pypi_0 pypi asgiref 3.4.1 pypi_0 pypi async-generator 1.10 pypi_0 pypi attrs 21.2.0 pyhd8ed1ab_0 conda-forge babel 2.9.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge bleach 4.1.0 pyhd8ed1ab_0 conda-forge boost 1.73.0 py36_11 https://conda.anaconda.org/anaconda brotlipy 0.7.0 py36h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2021.5.30 ha878542_0 conda-forge cachetools 4.2.2 pypi_0 pypi certifi 2021.5.30 py36h5fab9bb_0 conda-forge cffi 1.14.6 py36h400218f_0 defaults chardet 4.0.0 py36h06a4308_1003 defaults click 8.0.1 pypi_0 pypi cloudpickle 1.6.0 pypi_0 pypi conda 4.10.3 py36h5fab9bb_0 conda-forge conda-package-handling 1.7.3 py36h27cfd23_1 defaults contextvars 2.4 pypi_0 pypi cryptography 3.4.7 py36hd23ed53_0 defaults cycler 0.10.0 pypi_0 pypi cython 0.29.24 pypi_0 pypi dataclasses 0.8 pypi_0 pypi decorator 4.4.2 pypi_0 pypi defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.22.0 py36h446f8a6_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 2.0.1 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 2.0 pypi_0 pypi future 0.18.2 pypi_0 pypi google-auth 1.35.0 pypi_0 pypi google-auth-oauthlib 0.4.5 pypi_0 pypi grpcio 1.39.0 pypi_0 pypi h11 0.12.0 pypi_0 pypi horovod 0.22.1 pypi_0 pypi httptools 0.3.0 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 2.10 pyhd3eb1b0_0 defaults imageio 2.9.0 pypi_0 pypi imageio-ffmpeg 0.4.5 pypi_0 pypi immutables 0.16 pypi_0 pypi importlib-metadata 4.8.1 py36h5fab9bb_0 conda-forge install 1.3.4 pypi_0 pypi ipykernel 5.5.5 py36hcb3619a_0 conda-forge ipython 7.16.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.4 pyhd8ed1ab_0 conda-forge itsdangerous 2.0.1 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 3.0.1 pyhd8ed1ab_0 conda-forge joblib 1.0.1 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.6 pypi_0 pypi jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter-archive 3.0.2 pypi_0 pypi jupyter-server 1.10.2 pypi_0 pypi jupyter_client 7.0.2 pyhd8ed1ab_0 conda-forge jupyter_core 4.7.1 py36h5fab9bb_0 conda-forge jupyterlab 3.1.8 pypi_0 pypi jupyterlab-execute-time 2.0.5 pypi_0 pypi jupyterlab-language-pack-zh-cn 0.1.post9 pypi_0 pypi jupyterlab-notifications 0.3.2 pypi_0 pypi jupyterlab-pygments 0.1.2 pypi_0 pypi jupyterlab-server 2.7.2 pypi_0 pypi jupyterlab_widgets 1.0.1 pyhd8ed1ab_0 conda-forge kiwisolver 1.3.1 pypi_0 pypi ld_impl_linux-64 2.35.1 h7274673_9 defaults libblas 3.9.0 11_linux64_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 11_linux64_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h5101ec6_17 defaults libgfortran-ng 11.1.0 h69a702a_8 conda-forge libgfortran5 11.1.0 h6c583b3_8 conda-forge libgomp 9.3.0 h5101ec6_17 defaults liblapack 3.9.0 11_linux64_openblas conda-forge libopenblas 0.3.17 pthreads_h8fe5266_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 hd4cf53a_17 defaults lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.4 pypi_0 pypi markupsafe 2.0.1 py36h8f6f2f9_0 conda-forge matplotlib 3.3.4 pypi_0 pypi mistune 0.8.4 py36h8f6f2f9_1004 conda-forge mmcv-full 1.3.12 pypi_0 pypi msgpack 1.0.2 pypi_0 pypi nbclassic 0.3.1 pypi_0 pypi nbclient 0.5.4 pypi_0 pypi nbconvert 6.0.7 pypi_0 pypi nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 he6710b0_1 defaults nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge networkx 2.5.1 pypi_0 pypi notebook 6.4.3 pypi_0 pypi numpy 1.19.5 py36hfc0c790_2 conda-forge oauthlib 3.1.1 pypi_0 pypi onnx 1.10.1 pypi_0 pypi onnxruntime 1.8.1 pypi_0 pypi openbayes-serving 0.1.18 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.1.2.100 pypi_0 pypi opencv-python-headless 4.1.2.100 pypi_0 pypi openssl 1.1.1k h7f98852_0 conda-forge packaging 21.0 pyhd8ed1ab_0 conda-forge pandas 1.1.5 pypi_0 pypi pandoc 2.14.2 h7f98852_0 conda-forge pandocfilters 1.4.3 pypi_0 pypi parso 0.7.1 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 8.3.1 pypi_0 pypi pip 21.2.2 py36h06a4308_0 defaults pprintpp 0.4.0 pypi_0 pypi prometheus_client 0.11.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.20 pypi_0 pypi protobuf 3.17.3 pypi_0 pypi psutil 5.8.0 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge py-boost 1.73.0 py36h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py36h27cfd23_0 defaults pycparser 2.20 py_2 defaults pygments 2.10.0 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd3eb1b0_1 defaults pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.18.0 pypi_0 pypi pysocks 1.7.1 py36h06a4308_0 defaults python 3.6.13 h12debd9_1 defaults python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge python-graphviz 0.17 pypi_0 pypi python_abi 3.6 2_cp36m conda-forge pytz 2021.1 pypi_0 pypi pywavelets 1.1.1 pypi_0 pypi pyyaml 5.4.1 pypi_0 pypi pyzmq 22.2.1 pypi_0 pypi readline 8.1 h27cfd23_0 defaults requests 2.25.1 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi requests-unixsocket 0.2.0 pypi_0 pypi rsa 4.7.2 pypi_0 pypi ruamel_yaml 0.15.100 py36h27cfd23_0 defaults scikit-image 0.17.2 pypi_0 pypi scikit-learn 0.24.2 pypi_0 pypi scipy 1.5.4 pypi_0 pypi seaborn 0.11.2 pypi_0 pypi send2trash 1.8.0 pyhd8ed1ab_0 conda-forge setuptools 57.4.0 pypi_0 pypi simplegeneric 0.8.1 py_1 conda-forge six 1.16.0 pyhd3eb1b0_0 defaults sniffio 1.2.0 pypi_0 pypi sqlite 3.36.0 hc218d9a_0 defaults tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.0 pypi_0 pypi terminado 0.11.1 py36h5fab9bb_0 conda-forge testpath 0.5.0 pyhd8ed1ab_0 conda-forge threadpoolctl 2.2.0 pypi_0 pypi tifffile 2020.9.3 pypi_0 pypi tk 8.6.10 hbc83047_0 defaults toolz 0.11.1 pypi_0 pypi torch 1.8.2+cu102 pypi_0 pypi torch-tb-profiler 0.2.1 pypi_0 pypi torchaudio 0.8.2 pypi_0 pypi torchvision 0.9.2+cu102 pypi_0 pypi tornado 6.1 py36h8f6f2f9_1 conda-forge tqdm 4.62.0 pyhd3eb1b0_1 defaults traitlets 4.3.3 py36h9f0ad1d_1 conda-forge typing 3.7.4.3 pypi_0 pypi typing-extensions 3.10.0.2 pypi_0 pypi typing_extensions 3.10.0.0 pyha770c72_0 conda-forge urllib3 1.26.6 pyhd3eb1b0_1 defaults uvicorn 0.15.0 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi websocket-client 1.2.1 pypi_0 pypi werkzeug 2.0.1 pypi_0 pypi wheel 0.37.0 pypi_0 pypi widgetsnbextension 3.5.1 py36h5fab9bb_4 conda-forge xgboost 1.4.2 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults yapf 0.31.0 pypi_0 pypi zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.5.0 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7b6447c_3 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## pytorch:2.0.0-py38-cu117 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main https://repo.anaconda.com/pkgs/main _openmp_mutex 5.1 1_gnu https://repo.anaconda.com/pkgs/main absl-py 1.4.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.2.2 pypi_0 pypi ansiwrap 0.8.4 pypi_0 pypi anyio 3.6.2 pypi_0 pypi appdirs 1.4.4 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asttokens 2.2.1 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.0 pypi_0 pypi babel 2.12.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.0.0 pypi_0 pypi boost 1.73.0 py38h06a4308_12 anaconda brotlipy 0.7.0 py38h27cfd23_1003 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 anaconda ca-certificates 2023.01.10 h06a4308_0 anaconda cachetools 4.2.4 pypi_0 pypi certifi 2022.12.7 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.3 pypi_0 pypi cloudpickle 2.2.1 pypi_0 pypi cmake 3.26.3 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi comm 0.1.3 pypi_0 pypi conda 23.1.0 py38h06a4308_0 anaconda conda-content-trust 0.1.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.0.2 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.7.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.0.7 pypi_0 pypi cryptography 39.0.1 py38h9ce1e76_0 https://repo.anaconda.com/pkgs/main cycler 0.11.0 pypi_0 pypi cython 0.29.33 pypi_0 pypi debugpy 1.6.7 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.0 py38he2161a6_0 conda-forge entrypoints 0.4 pypi_0 pypi enum34 1.1.10 pypi_0 pypi executing 1.2.0 pypi_0 pypi fastjsonschema 2.16.3 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi filelock 3.12.0 pypi_0 pypi flask 2.2.3 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 23.3.3 pypi_0 pypi fonttools 4.39.0 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 1.35.0 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi grpcio 1.54.0 pypi_0 pypi h11 0.14.0 pypi_0 pypi horovod 0.27.0 pypi_0 pypi httptools 0.5.0 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 58.2 he6710b0_3 anaconda idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.26.0 pypi_0 pypi imageio-ffmpeg 0.4.8 pypi_0 pypi importlib-metadata 6.6.0 pypi_0 pypi importlib-resources 5.12.0 pypi_0 pypi install 1.3.5 pypi_0 pypi ipykernel 6.22.0 pypi_0 pypi ipython 8.12.0 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.0.6 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.18.2 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.2.0 pypi_0 pypi jpeg 9e h166bdaf_1 conda-forge json5 0.9.11 pypi_0 pypi jsonschema 4.17.3 pypi_0 pypi jupyter-archive 3.3.4 pypi_0 pypi jupyter-client 8.2.0 pypi_0 pypi jupyter-core 5.3.0 pypi_0 pypi jupyter-server 1.24.0 pypi_0 pypi jupyterlab 3.4.3 pypi_0 pypi jupyterlab-colab-bridge 0.1.5 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.6.post1 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.22.1 pypi_0 pypi jupyterlab-widgets 3.0.7 pypi_0 pypi kiwisolver 1.4.4 pypi_0 pypi lazy-loader 0.1 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libblas 3.9.0 15_linux64_openblas conda-forge libboost 1.73.0 h28710b8_12 anaconda libcblas 3.9.0 15_linux64_openblas conda-forge libffi 3.4.2 h6a678d5_6 https://repo.anaconda.com/pkgs/main libgcc-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main libgfortran-ng 12.2.0 h69a702a_19 conda-forge libgfortran5 12.2.0 h337968e_19 conda-forge libgomp 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main liblapack 3.9.0 15_linux64_openblas conda-forge libopenblas 0.3.20 pthreads_h78a6416_0 conda-forge libpng 1.6.39 h5eee18b_0 https://repo.anaconda.com/pkgs/main librosa 0.10.0.post2 pypi_0 pypi libstdcxx-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main lightgbm 2.3.1 pypi_0 pypi lit 16.0.1 pypi_0 pypi llvmlite 0.39.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 anaconda markdown 3.4.3 pypi_0 pypi markupsafe 2.1.2 pypi_0 pypi matplotlib 3.7.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 2.0.5 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.5 pypi_0 pypi nbclassic 0.5.5 pypi_0 pypi nbclient 0.7.3 pypi_0 pypi nbconvert 7.3.1 pypi_0 pypi nbformat 5.8.0 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.6 pypi_0 pypi networkx 3.0 pypi_0 pypi notebook-shim 0.2.2 pypi_0 pypi numba 0.56.4 pypi_0 pypi numpy 1.23.5 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi onnx 1.13.1 pypi_0 pypi onnxruntime 1.14.1 pypi_0 pypi openbayes-serving 0.2.5 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1t h7f8727e_0 https://repo.anaconda.com/pkgs/main packaging 23.0 pypi_0 pypi pandas 1.5.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.4.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 9.4.0 pypi_0 pypi pip 23.0.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 3.2.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.6.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.16.0 pypi_0 pypi prompt-toolkit 3.0.38 pypi_0 pypi protobuf 3.20.3 pypi_0 pypi psutil 5.9.5 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h51133e4_12 anaconda pyasn1 0.5.0 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pycosat 0.6.4 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.15.1 pypi_0 pypi pyopenssl 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.0.9 pypi_0 pypi pyrsistent 0.19.3 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.16 h7a1cb2a_3 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2022.7.1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 25.0.2 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main requests 2.28.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.20.0 pypi_0 pypi scikit-learn 1.2.1 pypi_0 pypi scipy 1.9.1 pypi_0 pypi seaborn 0.12.2 pypi_0 pypi send2trash 1.8.0 pypi_0 pypi setuptools 67.5.1 pypi_0 pypi six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.4.1 pypi_0 pypi soxr 0.3.5 pypi_0 pypi sqlite 3.40.1 h5082296_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.2 pypi_0 pypi sympy 1.11.1 pypi_0 pypi tenacity 8.2.2 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi terminado 0.17.1 pypi_0 pypi textwrap3 0.9.2 pypi_0 pypi threadpoolctl 3.1.0 pypi_0 pypi tifffile 2023.2.28 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main toolz 0.12.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main torch 2.0.0+cu117 pypi_0 pypi torch-tb-profiler 0.4.1 pypi_0 pypi torchaudio 2.0.1+cu117 pypi_0 pypi torchvision 0.15.1+cu117 pypi_0 pypi tornado 6.3.1 pypi_0 pypi tqdm 4.64.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main traitlets 5.9.0 pypi_0 pypi triton 2.0.0 pypi_0 pypi typing-extensions 4.5.0 pypi_0 pypi urllib3 1.26.14 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.21.1 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.6 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.5.1 pypi_0 pypi werkzeug 2.2.3 pypi_0 pypi wheel 0.38.4 pypi_0 pypi widgetsnbextension 4.0.7 pypi_0 pypi xgboost 1.7.4 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.10 h5eee18b_1 https://repo.anaconda.com/pkgs/main zipp 3.15.0 pypi_0 pypi zlib 1.2.13 h5eee18b_0 https://repo.anaconda.com/pkgs/main zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.2 ha4553b6_0 anaconda ``` --- ## pytorch:2.0.1-py38-cu118 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 2.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi aiofiles 22.1.0 pypi_0 pypi aiosqlite 0.19.0 pypi_0 pypi altair 5.1.2 pypi_0 pypi anyio 4.0.0 pypi_0 pypi archspec 0.2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.1 pypi_0 pypi babel 2.13.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi boltons 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main boost 1.82.0 py38h06a4308_2 anaconda brotli-python 1.0.9 py38h6a678d5_7 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 https://repo.anaconda.com/pkgs/main c-ares 1.19.1 h5eee18b_0 https://repo.anaconda.com/pkgs/main ca-certificates 2023.08.22 h06a4308_0 https://repo.anaconda.com/pkgs/main cachetools 4.2.4 pypi_0 pypi certifi 2023.7.22 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.7 pypi_0 pypi cloudpickle 3.0.0 pypi_0 pypi cmake 3.27.7 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi comm 0.2.0 pypi_0 pypi conda 23.10.0 py38h06a4308_0 anaconda conda-content-trust 0.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-libmamba-solver 23.11.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.9.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.1.1 pypi_0 pypi cryptography 41.0.3 py38hdda0065_0 https://repo.anaconda.com/pkgs/main cycler 0.12.1 pypi_0 pypi cython 3.0.5 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.2 py38h28258f8_2 conda-forge entrypoints 0.4 pypi_0 pypi exceptiongroup 1.2.0 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastjsonschema 2.19.0 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi filelock 3.13.1 pypi_0 pypi flask 3.0.0 pypi_0 pypi flask-cors 4.0.0 pypi_0 pypi flatbuffers 23.5.26 pypi_0 pypi fmt 9.1.0 hdb19cb5_0 https://repo.anaconda.com/pkgs/main fonttools 4.44.1 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 2.23.4 pypi_0 pypi google-auth-oauthlib 1.0.0 pypi_0 pypi grpcio 1.59.2 pypi_0 pypi h11 0.14.0 pypi_0 pypi httptools 0.6.1 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 73.1 h6a678d5_0 https://repo.anaconda.com/pkgs/main idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.32.0 pypi_0 pypi imageio-ffmpeg 0.4.9 pypi_0 pypi importlib-metadata 6.8.0 pypi_0 pypi importlib-resources 6.1.1 pypi_0 pypi ipykernel 6.27.0 pypi_0 pypi ipython 8.12.3 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.1.1 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.3.2 pypi_0 pypi json5 0.9.14 pypi_0 pypi jsonpatch 1.32 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonpointer 2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonschema 4.20.0 pypi_0 pypi jsonschema-specifications 2023.11.1 pypi_0 pypi jupyter-archive 3.4.0 pypi_0 pypi jupyter-client 7.4.9 pypi_0 pypi jupyter-core 5.5.0 pypi_0 pypi jupyter-events 0.9.0 pypi_0 pypi jupyter-server 2.11.0 pypi_0 pypi jupyter-server-fileid 0.9.0 pypi_0 pypi jupyter-server-terminals 0.4.4 pypi_0 pypi jupyter-server-ydoc 0.8.0 pypi_0 pypi jupyter-ydoc 0.2.5 pypi_0 pypi jupyterlab 3.6.5 pypi_0 pypi jupyterlab-colab-bridge 0.1.6 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 4.0.post5 pypi_0 pypi jupyterlab-notifications 0.5.0 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.25.2 pypi_0 pypi jupyterlab-widgets 3.0.9 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi krb5 1.20.1 h143b758_1 https://repo.anaconda.com/pkgs/main lazy-loader 0.3 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libarchive 3.6.2 h6ac8c49_2 https://repo.anaconda.com/pkgs/main libblas 3.9.0 19_linux64_openblas conda-forge libboost 1.82.0 h109eef0_2 anaconda libcblas 3.9.0 19_linux64_openblas conda-forge libcurl 8.4.0 h251f7ec_0 https://repo.anaconda.com/pkgs/main libedit 3.1.20221030 h5eee18b_0 https://repo.anaconda.com/pkgs/main libev 4.33 h7f8727e_1 https://repo.anaconda.com/pkgs/main libffi 3.4.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 19_linux64_openblas conda-forge libmamba 1.5.3 haf1ee3a_0 https://repo.anaconda.com/pkgs/main libmambapy 1.5.3 py38h2dafd23_0 https://repo.anaconda.com/pkgs/main libnghttp2 1.57.0 h2d74bed_0 https://repo.anaconda.com/pkgs/main libopenblas 0.3.24 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge librosa 0.10.1 pypi_0 pypi libsolv 0.7.24 he621ea3_0 https://repo.anaconda.com/pkgs/main libsqlite 3.44.0 h2797004_0 conda-forge libssh2 1.10.0 hdbd6064_2 https://repo.anaconda.com/pkgs/main libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libxml2 2.10.4 hf1b16e4_1 https://repo.anaconda.com/pkgs/main libzlib 1.2.13 hd590300_5 conda-forge lit 17.0.5 pypi_0 pypi llvmlite 0.41.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main markdown 3.5.1 pypi_0 pypi markdown-it-py 3.0.0 pypi_0 pypi markupsafe 2.1.3 pypi_0 pypi matplotlib 3.7.3 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mdurl 0.1.2 pypi_0 pypi mistune 3.0.2 pypi_0 pypi mmcv 2.0.0 pypi_0 pypi mmengine 0.10.1 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.7 pypi_0 pypi nbclassic 1.0.0 pypi_0 pypi nbclient 0.9.0 pypi_0 pypi nbconvert 7.11.0 pypi_0 pypi nbformat 5.9.2 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.8 pypi_0 pypi networkx 3.1 pypi_0 pypi notebook 6.5.6 pypi_0 pypi notebook-shim 0.2.3 pypi_0 pypi numba 0.58.1 pypi_0 pypi numpy 1.24.4 py38h59b608b_0 conda-forge oauthlib 3.2.2 pypi_0 pypi onnx 1.15.0 pypi_0 pypi onnxruntime 1.16.3 pypi_0 pypi openbayes-serving 0.3.1 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.8.1.78 pypi_0 pypi openssl 3.1.4 hd590300_0 conda-forge overrides 7.4.0 pypi_0 pypi packaging 23.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pandas 2.0.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.5.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pcre2 10.42 hebb0a14_0 https://repo.anaconda.com/pkgs/main pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 10.1.0 pypi_0 pypi pip 23.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 4.0.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.8.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.19.0 pypi_0 pypi prompt-toolkit 3.0.41 pypi_0 pypi protobuf 4.25.1 pypi_0 pypi psutil 5.9.6 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.82.0 py38h3c18c91_2 anaconda pyasn1 0.5.0 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pybind11-abi 4 hd3eb1b0_1 https://repo.anaconda.com/pkgs/main pycosat 0.6.6 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.17.2 pypi_0 pypi pyopenssl 23.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.1.1 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.18 h955ad1f_0 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2023.3.post1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 24.0.1 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main referencing 0.31.0 pypi_0 pypi reproc 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main reproc-cpp 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main requests 2.31.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rich 13.7.0 pypi_0 pypi rpds-py 0.13.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.21.0 pypi_0 pypi scikit-learn 1.3.2 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.13.0 pypi_0 pypi send2trash 1.8.2 pypi_0 pypi setuptools 68.2.2 pypi_0 pypi six 1.16.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.5 pypi_0 pypi soxr 0.3.7 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.3 pypi_0 pypi sympy 1.12 pypi_0 pypi tenacity 8.2.3 pypi_0 pypi tensorboard 2.14.0 pypi_0 pypi tensorboard-data-server 0.7.2 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi termcolor 2.3.0 pypi_0 pypi terminado 0.18.0 pypi_0 pypi threadpoolctl 3.2.0 pypi_0 pypi tifffile 2023.7.10 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main tomli 2.0.1 pypi_0 pypi toolz 0.12.0 pypi_0 pypi torch 2.0.1+cu118 pypi_0 pypi torch-tb-profiler 0.4.3 pypi_0 pypi torchaudio 2.0.2+cu118 pypi_0 pypi torchvision 0.15.2+cu118 pypi_0 pypi tornado 6.3.3 pypi_0 pypi tqdm 4.65.0 py38hb070fc8_0 https://repo.anaconda.com/pkgs/main traitlets 5.13.0 pypi_0 pypi triton 2.0.0 pypi_0 pypi types-python-dateutil 2.8.19.14 pypi_0 pypi typing-extensions 4.8.0 pypi_0 pypi tzdata 2023.3 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.24.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.12 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.6.4 pypi_0 pypi werkzeug 3.0.1 pypi_0 pypi wheel 0.41.3 pypi_0 pypi widgetsnbextension 4.0.9 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main y-py 0.6.2 pypi_0 pypi yaml-cpp 0.8.0 h6a678d5_0 https://repo.anaconda.com/pkgs/main yapf 0.40.2 pypi_0 pypi ypy-websocket 0.8.4 pypi_0 pypi zipp 3.17.0 pypi_0 pypi zlib 1.2.13 hd590300_5 conda-forge zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.5 hc292b87_0 https://repo.anaconda.com/pkgs/main ``` --- ## pytorch:2.1.0-py310-cu121 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 2.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi addict 2.4.0 pypi_0 pypi aiofiles 22.1.0 pypi_0 pypi aiosqlite 0.19.0 pypi_0 pypi altair 5.1.2 pypi_0 pypi anyio 4.0.0 pypi_0 pypi archspec 0.2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.1 pypi_0 pypi babel 2.13.1 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi boltons 23.0.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main boost 1.82.0 py310h06a4308_2 anaconda brotli-python 1.0.9 py310h6a678d5_7 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 https://repo.anaconda.com/pkgs/main c-ares 1.19.1 h5eee18b_0 https://repo.anaconda.com/pkgs/main ca-certificates 2023.08.22 h06a4308_0 https://repo.anaconda.com/pkgs/main cachetools 4.2.4 pypi_0 pypi certifi 2023.7.22 py310h06a4308_0 anaconda cffi 1.15.1 py310h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.7 pypi_0 pypi cloudpickle 3.0.0 pypi_0 pypi coloredlogs 15.0.1 pypi_0 pypi comm 0.2.0 pypi_0 pypi conda 23.10.0 py310h06a4308_0 anaconda conda-content-trust 0.2.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main conda-libmamba-solver 23.11.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.2.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.9.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.2.0 pypi_0 pypi cryptography 41.0.3 py310hdda0065_0 https://repo.anaconda.com/pkgs/main cycler 0.12.1 pypi_0 pypi cython 3.0.5 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.2 py310h295458a_2 conda-forge entrypoints 0.4 pypi_0 pypi exceptiongroup 1.2.0 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastjsonschema 2.19.0 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi filelock 3.13.1 pypi_0 pypi flask 3.0.0 pypi_0 pypi flask-cors 4.0.0 pypi_0 pypi flatbuffers 23.5.26 pypi_0 pypi fmt 9.1.0 hdb19cb5_0 https://repo.anaconda.com/pkgs/main fonttools 4.44.0 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi fsspec 2023.10.0 pypi_0 pypi future 0.18.3 pypi_0 pypi google-auth 2.23.4 pypi_0 pypi google-auth-oauthlib 1.0.0 pypi_0 pypi grpcio 1.59.3 pypi_0 pypi h11 0.14.0 pypi_0 pypi httptools 0.6.1 pypi_0 pypi humanfriendly 10.0 pypi_0 pypi icu 73.1 h6a678d5_0 https://repo.anaconda.com/pkgs/main idna 3.4 py310h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.32.0 pypi_0 pypi imageio-ffmpeg 0.4.9 pypi_0 pypi importlib-metadata 6.8.0 pypi_0 pypi ipykernel 6.27.0 pypi_0 pypi ipython 8.17.2 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.1.1 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.3.2 pypi_0 pypi json5 0.9.14 pypi_0 pypi jsonpatch 1.32 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonpointer 2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonschema 4.20.0 pypi_0 pypi jsonschema-specifications 2023.11.1 pypi_0 pypi jupyter-archive 3.4.0 pypi_0 pypi jupyter-client 7.4.9 pypi_0 pypi jupyter-core 5.5.0 pypi_0 pypi jupyter-events 0.9.0 pypi_0 pypi jupyter-server 2.11.0 pypi_0 pypi jupyter-server-fileid 0.9.0 pypi_0 pypi jupyter-server-terminals 0.4.4 pypi_0 pypi jupyter-server-ydoc 0.8.0 pypi_0 pypi jupyter-ydoc 0.2.5 pypi_0 pypi jupyterlab 3.6.5 pypi_0 pypi jupyterlab-colab-bridge 0.1.6 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 4.0.post5 pypi_0 pypi jupyterlab-notifications 0.5.0 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.25.2 pypi_0 pypi jupyterlab-widgets 3.0.9 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi krb5 1.20.1 h143b758_1 https://repo.anaconda.com/pkgs/main lazy-loader 0.3 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libarchive 3.6.2 h6ac8c49_2 https://repo.anaconda.com/pkgs/main libblas 3.9.0 19_linux64_openblas conda-forge libboost 1.82.0 h109eef0_2 anaconda libcblas 3.9.0 19_linux64_openblas conda-forge libcurl 8.4.0 h251f7ec_0 https://repo.anaconda.com/pkgs/main libedit 3.1.20221030 h5eee18b_0 https://repo.anaconda.com/pkgs/main libev 4.33 h7f8727e_1 https://repo.anaconda.com/pkgs/main libffi 3.4.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 19_linux64_openblas conda-forge libmamba 1.5.3 haf1ee3a_0 https://repo.anaconda.com/pkgs/main libmambapy 1.5.3 py310h2dafd23_0 https://repo.anaconda.com/pkgs/main libnghttp2 1.57.0 h2d74bed_0 https://repo.anaconda.com/pkgs/main libopenblas 0.3.24 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge librosa 0.10.1 pypi_0 pypi libsolv 0.7.24 he621ea3_0 https://repo.anaconda.com/pkgs/main libsqlite 3.44.0 h2797004_0 conda-forge libssh2 1.10.0 hdbd6064_2 https://repo.anaconda.com/pkgs/main libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libuuid 1.41.5 h5eee18b_0 https://repo.anaconda.com/pkgs/main libxml2 2.10.4 hf1b16e4_1 https://repo.anaconda.com/pkgs/main libzlib 1.2.13 hd590300_5 conda-forge lightgbm 2.3.1 pypi_0 pypi llvmlite 0.41.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main markdown 3.5.1 pypi_0 pypi markdown-it-py 3.0.0 pypi_0 pypi markupsafe 2.1.3 pypi_0 pypi matplotlib 3.8.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mdurl 0.1.2 pypi_0 pypi mistune 3.0.2 pypi_0 pypi mmcv 2.1.0 pypi_0 pypi mmengine 0.10.1 pypi_0 pypi mpmath 1.3.0 pypi_0 pypi msgpack 1.0.7 pypi_0 pypi nbclassic 1.0.0 pypi_0 pypi nbclient 0.9.0 pypi_0 pypi nbconvert 7.11.0 pypi_0 pypi nbformat 5.9.2 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.8 pypi_0 pypi networkx 3.2.1 pypi_0 pypi notebook 6.5.6 pypi_0 pypi notebook-shim 0.2.3 pypi_0 pypi numba 0.58.1 pypi_0 pypi numpy 1.26.2 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi onnx 1.15.0 pypi_0 pypi onnxruntime 1.16.3 pypi_0 pypi openbayes-serving 0.3.1 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.8.1.78 pypi_0 pypi openssl 3.1.4 hd590300_0 conda-forge overrides 7.4.0 pypi_0 pypi packaging 23.1 py310h06a4308_0 https://repo.anaconda.com/pkgs/main pandas 2.1.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.5.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pcre2 10.42 hebb0a14_0 https://repo.anaconda.com/pkgs/main pexpect 4.8.0 pypi_0 pypi pillow 10.1.0 pypi_0 pypi pip 23.3 py310h06a4308_0 https://repo.anaconda.com/pkgs/main platformdirs 4.0.0 pypi_0 pypi pluggy 1.0.0 py310h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.8.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.19.0 pypi_0 pypi prompt-toolkit 3.0.41 pypi_0 pypi protobuf 4.25.1 pypi_0 pypi psutil 5.9.6 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.82.0 py310h3c18c91_2 anaconda pyasn1 0.5.1 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pybind11-abi 4 hd3eb1b0_1 https://repo.anaconda.com/pkgs/main pycosat 0.6.6 py310h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.17.2 pypi_0 pypi pyopenssl 23.2.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.1.1 pypi_0 pypi pysocks 1.7.1 py310h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.10.13 h955ad1f_0 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi python_abi 3.10 2_cp310 conda-forge pytz 2023.3.post1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 24.0.1 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main referencing 0.31.0 pypi_0 pypi reproc 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main reproc-cpp 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main requests 2.31.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rich 13.7.0 pypi_0 pypi rpds-py 0.13.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py310h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py310h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.22.0 pypi_0 pypi scikit-learn 1.3.2 pypi_0 pypi scipy 1.11.3 pypi_0 pypi seaborn 0.13.0 pypi_0 pypi send2trash 1.8.2 pypi_0 pypi setuptools 68.2.2 pypi_0 pypi six 1.16.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.5 pypi_0 pypi soxr 0.3.7 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.3 pypi_0 pypi sympy 1.12 pypi_0 pypi tenacity 8.2.3 pypi_0 pypi tensorboard 2.14.0 pypi_0 pypi tensorboard-data-server 0.7.2 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi termcolor 2.3.0 pypi_0 pypi terminado 0.18.0 pypi_0 pypi threadpoolctl 3.2.0 pypi_0 pypi tifffile 2023.9.26 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main tomli 2.0.1 pypi_0 pypi toolz 0.12.0 pypi_0 pypi torch 2.1.0+cu121 pypi_0 pypi torch-tb-profiler 0.4.3 pypi_0 pypi torchaudio 2.1.0+cu121 pypi_0 pypi torchvision 0.16.0+cu121 pypi_0 pypi tornado 6.3.3 pypi_0 pypi tqdm 4.65.0 py310h2f386ee_0 https://repo.anaconda.com/pkgs/main traitlets 5.13.0 pypi_0 pypi triton 2.1.0 pypi_0 pypi truststore 0.8.0 py310h06a4308_0 https://repo.anaconda.com/pkgs/main types-python-dateutil 2.8.19.14 pypi_0 pypi typing-extensions 4.8.0 pypi_0 pypi tzdata 2023.3 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py310h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.24.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.12 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.6.4 pypi_0 pypi werkzeug 3.0.1 pypi_0 pypi wheel 0.41.3 pypi_0 pypi widgetsnbextension 4.0.9 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main y-py 0.6.2 pypi_0 pypi yaml-cpp 0.8.0 h6a678d5_0 https://repo.anaconda.com/pkgs/main yapf 0.40.2 pypi_0 pypi ypy-websocket 0.8.4 pypi_0 pypi zipp 3.17.0 pypi_0 pypi zlib 1.2.13 hd590300_5 conda-forge zstandard 0.19.0 py310h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.5 hc292b87_0 https://repo.anaconda.com/pkgs/main ``` --- ## tensorflow:1.15.0-py36-cpu ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 1_gnu conda-forge absl-py 0.12.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.1.0 pypi_0 pypi anyio 2.2.0 pypi_0 pypi argon2-cffi 20.1.0 py36h8f6f2f9_2 conda-forge astor 0.8.1 pypi_0 pypi async_generator 1.10 py_0 conda-forge attrs 20.3.0 pyhd3deb0d_0 conda-forge babel 2.9.0 pypi_0 pypi backcall 0.2.0 pypi_0 pypi backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge beautifulsoup4 4.9.3 pypi_0 pypi bleach 3.3.0 pyh44b312d_0 conda-forge blis 0.7.4 pypi_0 pypi boost 1.73.0 py36_11 https://conda.anaconda.org/anaconda bottleneck 1.3.2 pypi_0 pypi brotlipy 0.7.0 py36h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2020.12.5 ha878542_0 conda-forge cached-property 1.5.2 pypi_0 pypi cachetools 4.2.1 pypi_0 pypi catalogue 2.0.1 pypi_0 pypi certifi 2020.12.5 py36h5fab9bb_1 conda-forge cffi 1.14.5 py36h261ae71_0 defaults chardet 4.0.0 py36h06a4308_1003 defaults click 7.1.2 pypi_0 pypi cloudpickle 1.6.0 pypi_0 pypi conda 4.10.0 py36h5fab9bb_1 conda-forge conda-package-handling 1.7.2 py36h03888b9_0 defaults contextvars 2.4 pypi_0 pypi cryptography 3.4.6 py36hd23ed53_0 defaults cupy-cuda100 8.6.0 pypi_0 pypi cycler 0.10.0 pypi_0 pypi cymem 2.0.5 pypi_0 pypi cython 0.29.22 pypi_0 pypi dataclasses 0.8 pypi_0 pypi decorator 4.4.2 pypi_0 pypi defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.21.1 py36hde86582_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi fastai 1.0.61 pypi_0 pypi fastprogress 1.0.0 pypi_0 pypi fastrlock 0.6 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 1.1.2 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi future 0.18.2 pypi_0 pypi gast 0.2.2 pypi_0 pypi gdal 3.0.4 pypi_0 pypi google-auth 1.28.0 pypi_0 pypi google-auth-oauthlib 0.4.3 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.36.1 pypi_0 pypi h11 0.12.0 pypi_0 pypi h5py 3.1.0 pypi_0 pypi httptools 0.1.1 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 2.10 pyhd3eb1b0_0 defaults imageio 2.9.0 pypi_0 pypi imageio-ffmpeg 0.4.3 pypi_0 pypi immutables 0.15 pypi_0 pypi importlib-metadata 3.7.3 pypi_0 pypi ipykernel 5.5.3 py36hcb3619a_0 conda-forge ipython 7.16.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.3 pyhd3deb0d_0 conda-forge itsdangerous 1.1.0 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 2.11.3 pyh44b312d_0 conda-forge joblib 1.0.1 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.5 pypi_0 pypi jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter-archive 3.0.0 pypi_0 pypi jupyter-packaging 0.7.12 pypi_0 pypi jupyter-server 1.6.1 pypi_0 pypi jupyter_client 6.1.12 pyhd8ed1ab_0 conda-forge jupyter_core 4.7.1 py36h5fab9bb_0 conda-forge jupyterlab 3.0.12 pypi_0 pypi jupyterlab-execute-time 2.0.2 pypi_0 pypi jupyterlab-language-pack-zh-cn 0.0.1.dev0 pypi_0 pypi jupyterlab-server 2.4.0 pypi_0 pypi jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_widgets 1.0.0 pyhd8ed1ab_1 conda-forge keras 2.2.5 pypi_0 pypi keras-applications 1.0.8 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.3.1 pypi_0 pypi ld_impl_linux-64 2.33.1 h53a641e_7 defaults libblas 3.9.0 8_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 8_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h2828fa1_18 conda-forge libgfortran-ng 9.3.0 hff62375_18 conda-forge libgfortran5 9.3.0 hff62375_18 conda-forge libgomp 9.3.0 h2828fa1_18 conda-forge liblapack 3.9.0 8_openblas conda-forge libopenblas 0.3.12 pthreads_h4812303_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 h6de172a_18 conda-forge lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.4 pypi_0 pypi markupsafe 1.1.1 py36h8f6f2f9_3 conda-forge matplotlib 3.3.4 pypi_0 pypi mistune 0.8.4 py36h8f6f2f9_1003 conda-forge msgpack 0.6.2 pypi_0 pypi murmurhash 1.0.5 pypi_0 pypi nbclassic 0.2.7 pypi_0 pypi nbclient 0.5.3 pyhd8ed1ab_0 conda-forge nbconvert 6.0.7 py36h5fab9bb_3 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 he6710b0_1 defaults nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge networkx 2.5 pypi_0 pypi notebook 6.3.0 py36h5fab9bb_0 conda-forge numexpr 2.7.3 pypi_0 pypi numpy 1.19.5 py36h2aa4a07_1 conda-forge nvidia-ml-py3 7.352.0 pypi_0 pypi oauthlib 3.1.0 pypi_0 pypi onnx 1.8.1 pypi_0 pypi onnxruntime 1.7.0 pypi_0 pypi openbayes-serving 0.1.14 pypi_0 pypi openbayestool 0.3.1 pypi_0 pypi opencv-python 4.1.1.100 pypi_0 pypi opencv-python-headless 4.1.1.100 pypi_0 pypi openssl 1.1.1k h7f98852_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi packaging 20.9 pyh44b312d_0 conda-forge pandas 1.1.5 pypi_0 pypi pandoc 2.12 h7f98852_0 conda-forge pandocfilters 1.4.3 pypi_0 pypi parso 0.7.1 pypi_0 pypi pathy 0.4.0 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 6.2.2 pypi_0 pypi pip 21.0.1 py36h06a4308_0 defaults pprintpp 0.4.0 pypi_0 pypi preshed 3.0.5 pypi_0 pypi prometheus_client 0.10.1 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.18 pypi_0 pypi protobuf 3.15.6 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge py-boost 1.73.0 py36h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py36h27cfd23_0 defaults pycparser 2.20 py_2 defaults pydantic 1.7.3 pypi_0 pypi pygments 2.8.1 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd3eb1b0_1 defaults pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py36h8f6f2f9_2 conda-forge pysocks 1.7.1 py36h06a4308_0 defaults python 3.6.13 hdb3f193_0 defaults python-dateutil 2.8.1 py_0 conda-forge python-graphviz 0.16 pypi_0 pypi python_abi 3.6 1_cp36m conda-forge pytorch-ignite 0.3.0 pypi_0 pypi pytz 2021.1 pypi_0 pypi pywavelets 1.1.1 pypi_0 pypi pyyaml 5.4.1 pypi_0 pypi pyzmq 22.0.3 py36h7068817_1 conda-forge readline 8.1 h27cfd23_0 defaults requests 2.25.1 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi rsa 4.7.2 pypi_0 pypi ruamel_yaml 0.15.100 py36h27cfd23_0 defaults scikit-image 0.17.2 pypi_0 pypi scikit-learn 0.24.1 pypi_0 pypi scipy 1.5.4 pypi_0 pypi seaborn 0.11.1 pypi_0 pypi send2trash 1.5.0 py_0 conda-forge setuptools 54.2.0 pypi_0 pypi simplegeneric 0.8.1 py_1 conda-forge six 1.15.0 py36h06a4308_0 defaults smart-open 3.0.0 pypi_0 pypi sniffio 1.2.0 pypi_0 pypi soupsieve 2.2.1 pypi_0 pypi spacy 3.0.5 pypi_0 pypi spacy-legacy 3.0.1 pypi_0 pypi sqlite 3.35.2 hdfb4753_0 defaults srsly 2.4.0 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.0 pypi_0 pypi tensorflow 1.15.0 pypi_0 pypi tensorflow-estimator 1.15.1 pypi_0 pypi termcolor 1.1.0 pypi_0 pypi terminado 0.9.4 py36h5fab9bb_0 conda-forge testpath 0.4.4 py_0 conda-forge thinc 8.0.2 pypi_0 pypi threadpoolctl 2.1.0 pypi_0 pypi tifffile 2020.9.3 pypi_0 pypi tk 8.6.10 hbc83047_0 defaults toolz 0.11.1 pypi_0 pypi torch 1.2.0+cpu pypi_0 pypi torchvision 0.4.0+cpu pypi_0 pypi tornado 6.1 py36h8f6f2f9_1 conda-forge tqdm 4.59.0 pyhd3eb1b0_1 defaults traitlets 4.3.3 py36h9f0ad1d_1 conda-forge typer 0.3.2 pypi_0 pypi typing 3.7.4.3 pypi_0 pypi typing_extensions 3.7.4.3 py_0 conda-forge urllib3 1.26.4 pyhd3eb1b0_0 defaults uvicorn 0.12.3 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wasabi 0.8.2 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi werkzeug 1.0.1 pypi_0 pypi wheel 0.36.2 pyhd3eb1b0_0 defaults widgetsnbextension 3.5.1 py36h5fab9bb_4 conda-forge wrapt 1.12.1 pypi_0 pypi xgboost 1.3.3 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.4.1 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7b6447c_3 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## tensorflow:1.15.0-py36-cu100 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 1_gnu conda-forge absl-py 0.12.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.1.0 pypi_0 pypi anyio 2.2.0 pypi_0 pypi argon2-cffi 20.1.0 py36h8f6f2f9_2 conda-forge astor 0.8.1 pypi_0 pypi async_generator 1.10 py_0 conda-forge attrs 20.3.0 pyhd3deb0d_0 conda-forge babel 2.9.0 pypi_0 pypi backcall 0.2.0 pypi_0 pypi backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge beautifulsoup4 4.9.3 pypi_0 pypi bleach 3.3.0 pyh44b312d_0 conda-forge blis 0.7.4 pypi_0 pypi boost 1.73.0 py36_11 https://conda.anaconda.org/anaconda bottleneck 1.3.2 pypi_0 pypi brotlipy 0.7.0 py36h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2020.12.5 ha878542_0 conda-forge cached-property 1.5.2 pypi_0 pypi cachetools 4.2.1 pypi_0 pypi catalogue 2.0.1 pypi_0 pypi certifi 2020.12.5 py36h5fab9bb_1 conda-forge cffi 1.14.5 py36h261ae71_0 defaults chardet 4.0.0 py36h06a4308_1003 defaults click 7.1.2 pypi_0 pypi cloudpickle 1.6.0 pypi_0 pypi conda 4.10.0 py36h5fab9bb_1 conda-forge conda-package-handling 1.7.2 py36h03888b9_0 defaults contextvars 2.4 pypi_0 pypi cryptography 3.4.6 py36hd23ed53_0 defaults cupy-cuda100 8.6.0 pypi_0 pypi cycler 0.10.0 pypi_0 pypi cymem 2.0.5 pypi_0 pypi cython 0.29.22 pypi_0 pypi dataclasses 0.8 pypi_0 pypi decorator 4.4.2 pypi_0 pypi defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.21.1 py36hde86582_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi fastai 1.0.61 pypi_0 pypi fastprogress 1.0.0 pypi_0 pypi fastrlock 0.6 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 1.1.2 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi future 0.18.2 pypi_0 pypi gast 0.2.2 pypi_0 pypi gdal 3.0.4 pypi_0 pypi google-auth 1.28.0 pypi_0 pypi google-auth-oauthlib 0.4.3 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.36.1 pypi_0 pypi h11 0.12.0 pypi_0 pypi h5py 3.1.0 pypi_0 pypi horovod 0.21.3 pypi_0 pypi httptools 0.1.1 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 2.10 pyhd3eb1b0_0 defaults imageio 2.9.0 pypi_0 pypi imageio-ffmpeg 0.4.3 pypi_0 pypi immutables 0.15 pypi_0 pypi importlib-metadata 3.7.3 pypi_0 pypi install 1.3.4 pypi_0 pypi ipykernel 5.5.3 py36hcb3619a_0 conda-forge ipython 7.16.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.3 pyhd3deb0d_0 conda-forge itsdangerous 1.1.0 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 2.11.3 pyh44b312d_0 conda-forge joblib 1.0.1 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.5 pypi_0 pypi jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter-archive 3.0.0 pypi_0 pypi jupyter-packaging 0.7.12 pypi_0 pypi jupyter-server 1.6.1 pypi_0 pypi jupyter_client 6.1.12 pyhd8ed1ab_0 conda-forge jupyter_core 4.7.1 py36h5fab9bb_0 conda-forge jupyterlab 3.0.12 pypi_0 pypi jupyterlab-execute-time 2.0.2 pypi_0 pypi jupyterlab-language-pack-zh-cn 0.0.1.dev0 pypi_0 pypi jupyterlab-server 2.4.0 pypi_0 pypi jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_widgets 1.0.0 pyhd8ed1ab_1 conda-forge keras 2.2.5 pypi_0 pypi keras-applications 1.0.8 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.3.1 pypi_0 pypi ld_impl_linux-64 2.33.1 h53a641e_7 defaults libblas 3.9.0 8_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 8_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h2828fa1_18 conda-forge libgfortran-ng 9.3.0 hff62375_18 conda-forge libgfortran5 9.3.0 hff62375_18 conda-forge libgomp 9.3.0 h2828fa1_18 conda-forge liblapack 3.9.0 8_openblas conda-forge libopenblas 0.3.12 pthreads_h4812303_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 h6de172a_18 conda-forge lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.4 pypi_0 pypi markupsafe 1.1.1 py36h8f6f2f9_3 conda-forge matplotlib 3.3.4 pypi_0 pypi mistune 0.8.4 py36h8f6f2f9_1003 conda-forge msgpack 0.6.2 pypi_0 pypi murmurhash 1.0.5 pypi_0 pypi nbclassic 0.2.7 pypi_0 pypi nbclient 0.5.3 pyhd8ed1ab_0 conda-forge nbconvert 6.0.7 py36h5fab9bb_3 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 he6710b0_1 defaults nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge networkx 2.5 pypi_0 pypi notebook 6.3.0 py36h5fab9bb_0 conda-forge numexpr 2.7.3 pypi_0 pypi numpy 1.19.5 py36h2aa4a07_1 conda-forge nvidia-ml-py3 7.352.0 pypi_0 pypi oauthlib 3.1.0 pypi_0 pypi onnx 1.8.1 pypi_0 pypi onnxruntime 1.7.0 pypi_0 pypi openbayes-serving 0.1.14 pypi_0 pypi openbayestool 0.3.1 pypi_0 pypi opencv-python 4.1.1.100 pypi_0 pypi opencv-python-headless 4.1.1.100 pypi_0 pypi openssl 1.1.1k h7f98852_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi packaging 20.9 pyh44b312d_0 conda-forge pandas 1.1.5 pypi_0 pypi pandoc 2.12 h7f98852_0 conda-forge pandocfilters 1.4.3 pypi_0 pypi parso 0.7.1 pypi_0 pypi pathy 0.4.0 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 6.2.2 pypi_0 pypi pip 21.0.1 py36h06a4308_0 defaults pprintpp 0.4.0 pypi_0 pypi preshed 3.0.5 pypi_0 pypi prometheus_client 0.10.1 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.18 pypi_0 pypi protobuf 3.15.6 pypi_0 pypi psutil 5.8.0 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge py-boost 1.73.0 py36h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py36h27cfd23_0 defaults pycparser 2.20 py_2 defaults pydantic 1.7.3 pypi_0 pypi pygments 2.8.1 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd3eb1b0_1 defaults pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py36h8f6f2f9_2 conda-forge pysocks 1.7.1 py36h06a4308_0 defaults python 3.6.13 hdb3f193_0 defaults python-dateutil 2.8.1 py_0 conda-forge python-graphviz 0.16 pypi_0 pypi python_abi 3.6 1_cp36m conda-forge pytorch-ignite 0.3.0 pypi_0 pypi pytz 2021.1 pypi_0 pypi pywavelets 1.1.1 pypi_0 pypi pyyaml 5.4.1 pypi_0 pypi pyzmq 22.0.3 py36h7068817_1 conda-forge readline 8.1 h27cfd23_0 defaults requests 2.25.1 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi rsa 4.7.2 pypi_0 pypi ruamel_yaml 0.15.100 py36h27cfd23_0 defaults scikit-image 0.17.2 pypi_0 pypi scikit-learn 0.24.1 pypi_0 pypi scipy 1.5.4 pypi_0 pypi seaborn 0.11.1 pypi_0 pypi send2trash 1.5.0 py_0 conda-forge setuptools 54.2.0 pypi_0 pypi simplegeneric 0.8.1 py_1 conda-forge six 1.15.0 py36h06a4308_0 defaults smart-open 3.0.0 pypi_0 pypi sniffio 1.2.0 pypi_0 pypi soupsieve 2.2.1 pypi_0 pypi spacy 3.0.5 pypi_0 pypi spacy-legacy 3.0.1 pypi_0 pypi sqlite 3.35.2 hdfb4753_0 defaults srsly 2.4.0 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.0 pypi_0 pypi tensorflow 1.15.0.100 pypi_0 pypi tensorflow-estimator 1.15.1 pypi_0 pypi tensorflow-gpu 1.15.0 pypi_0 pypi termcolor 1.1.0 pypi_0 pypi terminado 0.9.4 py36h5fab9bb_0 conda-forge testpath 0.4.4 py_0 conda-forge thinc 8.0.2 pypi_0 pypi threadpoolctl 2.1.0 pypi_0 pypi tifffile 2020.9.3 pypi_0 pypi tk 8.6.10 hbc83047_0 defaults toolz 0.11.1 pypi_0 pypi torch 1.2.0 pypi_0 pypi torchvision 0.4.0 pypi_0 pypi tornado 6.1 py36h8f6f2f9_1 conda-forge tqdm 4.59.0 pyhd3eb1b0_1 defaults traitlets 4.3.3 py36h9f0ad1d_1 conda-forge typer 0.3.2 pypi_0 pypi typing 3.7.4.3 pypi_0 pypi typing_extensions 3.7.4.3 py_0 conda-forge urllib3 1.26.4 pyhd3eb1b0_0 defaults uvicorn 0.12.3 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wasabi 0.8.2 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi werkzeug 1.0.1 pypi_0 pypi wheel 0.36.2 pyhd3eb1b0_0 defaults widgetsnbextension 3.5.1 py36h5fab9bb_4 conda-forge wrapt 1.12.1 pypi_0 pypi xgboost 1.3.3 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.4.1 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7b6447c_3 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## tensorflow:2.12.0-py38-cu118 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 2_gnu conda-forge absl-py 2.0.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi aiofiles 22.1.0 pypi_0 pypi aiosqlite 0.19.0 pypi_0 pypi altair 5.1.2 pypi_0 pypi anyio 4.0.0 pypi_0 pypi archspec 0.2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main argon2-cffi 23.1.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi arrow 1.3.0 pypi_0 pypi asttokens 2.4.1 pypi_0 pypi astunparse 1.6.3 pypi_0 pypi attrs 23.1.0 pypi_0 pypi audioread 3.0.1 pypi_0 pypi babel 2.13.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.12.2 pypi_0 pypi bleach 6.1.0 pypi_0 pypi blinker 1.7.0 pypi_0 pypi boltons 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main boost 1.82.0 py38h06a4308_2 anaconda brotli-python 1.0.9 py38h6a678d5_7 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 https://repo.anaconda.com/pkgs/main c-ares 1.19.1 h5eee18b_0 https://repo.anaconda.com/pkgs/main ca-certificates 2023.08.22 h06a4308_0 https://repo.anaconda.com/pkgs/main cachetools 5.3.2 pypi_0 pypi certifi 2023.7.22 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.7 pypi_0 pypi cloudpickle 3.0.0 pypi_0 pypi comm 0.2.0 pypi_0 pypi conda 23.10.0 py38h06a4308_0 anaconda conda-content-trust 0.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-libmamba-solver 23.11.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.9.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.1.1 pypi_0 pypi cryptography 41.0.3 py38hdda0065_0 https://repo.anaconda.com/pkgs/main cycler 0.12.1 pypi_0 pypi cython 3.0.5 pypi_0 pypi debugpy 1.8.0 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.2 py38h28258f8_2 conda-forge entrypoints 0.4 pypi_0 pypi exceptiongroup 1.1.3 pypi_0 pypi executing 2.0.1 pypi_0 pypi fastjsonschema 2.19.0 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 3.0.0 pypi_0 pypi flask-cors 4.0.0 pypi_0 pypi flatbuffers 23.5.26 pypi_0 pypi fmt 9.1.0 hdb19cb5_0 https://repo.anaconda.com/pkgs/main fonttools 4.44.1 pypi_0 pypi fqdn 1.5.1 pypi_0 pypi future 0.18.3 pypi_0 pypi gast 0.4.0 pypi_0 pypi google-auth 2.23.4 pypi_0 pypi google-auth-oauthlib 1.0.0 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.59.2 pypi_0 pypi h11 0.14.0 pypi_0 pypi h5py 3.10.0 pypi_0 pypi httptools 0.6.1 pypi_0 pypi icu 73.1 h6a678d5_0 https://repo.anaconda.com/pkgs/main idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.32.0 pypi_0 pypi imageio-ffmpeg 0.4.9 pypi_0 pypi importlib-metadata 6.8.0 pypi_0 pypi importlib-resources 6.1.1 pypi_0 pypi ipykernel 6.26.0 pypi_0 pypi ipython 8.12.3 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.1.1 pypi_0 pypi isoduration 20.11.0 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jax 0.4.13 pypi_0 pypi jedi 0.19.1 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.3.2 pypi_0 pypi json5 0.9.14 pypi_0 pypi jsonpatch 1.32 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonpointer 2.1 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main jsonschema 4.19.2 pypi_0 pypi jsonschema-specifications 2023.11.1 pypi_0 pypi jupyter-archive 3.4.0 pypi_0 pypi jupyter-client 7.4.9 pypi_0 pypi jupyter-core 5.5.0 pypi_0 pypi jupyter-events 0.9.0 pypi_0 pypi jupyter-server 2.10.1 pypi_0 pypi jupyter-server-fileid 0.9.0 pypi_0 pypi jupyter-server-terminals 0.4.4 pypi_0 pypi jupyter-server-ydoc 0.8.0 pypi_0 pypi jupyter-ydoc 0.2.5 pypi_0 pypi jupyterlab 3.6.5 pypi_0 pypi jupyterlab-colab-bridge 0.1.6 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 4.0.post5 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.25.1 pypi_0 pypi jupyterlab-widgets 3.0.9 pypi_0 pypi keras 2.12.0 pypi_0 pypi kiwisolver 1.4.5 pypi_0 pypi krb5 1.20.1 h143b758_1 https://repo.anaconda.com/pkgs/main lazy-loader 0.3 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libarchive 3.6.2 h6ac8c49_2 https://repo.anaconda.com/pkgs/main libblas 3.9.0 19_linux64_openblas conda-forge libboost 1.82.0 h109eef0_2 anaconda libcblas 3.9.0 19_linux64_openblas conda-forge libclang 16.0.6 pypi_0 pypi libcurl 8.4.0 h251f7ec_0 https://repo.anaconda.com/pkgs/main libedit 3.1.20221030 h5eee18b_0 https://repo.anaconda.com/pkgs/main libev 4.33 h7f8727e_1 https://repo.anaconda.com/pkgs/main libffi 3.4.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main libgcc-ng 13.2.0 h807b86a_3 conda-forge libgfortran-ng 13.2.0 h69a702a_3 conda-forge libgfortran5 13.2.0 ha4646dd_3 conda-forge libgomp 13.2.0 h807b86a_3 conda-forge libjpeg-turbo 3.0.0 hd590300_1 conda-forge liblapack 3.9.0 19_linux64_openblas conda-forge libmamba 1.5.3 haf1ee3a_0 https://repo.anaconda.com/pkgs/main libmambapy 1.5.3 py38h2dafd23_0 https://repo.anaconda.com/pkgs/main libnghttp2 1.57.0 h2d74bed_0 https://repo.anaconda.com/pkgs/main libopenblas 0.3.24 pthreads_h413a1c8_0 conda-forge libpng 1.6.39 h753d276_0 conda-forge librosa 0.10.1 pypi_0 pypi libsolv 0.7.24 he621ea3_0 https://repo.anaconda.com/pkgs/main libsqlite 3.44.0 h2797004_0 conda-forge libssh2 1.10.0 hdbd6064_2 https://repo.anaconda.com/pkgs/main libstdcxx-ng 13.2.0 h7e041cc_3 conda-forge libxml2 2.10.4 hf1b16e4_1 https://repo.anaconda.com/pkgs/main libzlib 1.2.13 hd590300_5 conda-forge llvmlite 0.41.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main markdown 3.5.1 pypi_0 pypi markupsafe 2.1.3 pypi_0 pypi matplotlib 3.7.3 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 3.0.2 pypi_0 pypi ml-dtypes 0.2.0 pypi_0 pypi msgpack 1.0.7 pypi_0 pypi nbclassic 1.0.0 pypi_0 pypi nbclient 0.9.0 pypi_0 pypi nbconvert 7.11.0 pypi_0 pypi nbformat 5.9.2 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.8 pypi_0 pypi networkx 3.1 pypi_0 pypi notebook 6.5.6 pypi_0 pypi notebook-shim 0.2.3 pypi_0 pypi numba 0.58.1 pypi_0 pypi numpy 1.24.4 py38h59b608b_0 conda-forge oauthlib 3.2.2 pypi_0 pypi openbayes-serving 0.3.1 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi openssl 3.1.4 hd590300_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi overrides 7.4.0 pypi_0 pypi packaging 23.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pandas 2.0.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.5.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pcre2 10.42 hebb0a14_0 https://repo.anaconda.com/pkgs/main pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 10.1.0 pypi_0 pypi pip 23.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 4.0.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.8.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.18.0 pypi_0 pypi prompt-toolkit 3.0.41 pypi_0 pypi protobuf 4.25.1 pypi_0 pypi psutil 5.9.6 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.82.0 py38h3c18c91_2 anaconda pyasn1 0.5.0 pypi_0 pypi pyasn1-modules 0.3.0 pypi_0 pypi pybind11-abi 4 hd3eb1b0_1 https://repo.anaconda.com/pkgs/main pycosat 0.6.6 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.16.1 pypi_0 pypi pyopenssl 23.2.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.1.1 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.18 h955ad1f_0 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python-json-logger 2.0.7 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2023.3.post1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0.1 pypi_0 pypi pyzmq 24.0.1 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main referencing 0.31.0 pypi_0 pypi reproc 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main reproc-cpp 14.2.4 h295c915_1 https://repo.anaconda.com/pkgs/main requests 2.31.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rfc3339-validator 0.1.4 pypi_0 pypi rfc3986-validator 0.1.1 pypi_0 pypi rpds-py 0.12.0 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.21.0 pypi_0 pypi scikit-learn 1.3.2 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.13.0 pypi_0 pypi send2trash 1.8.2 pypi_0 pypi setuptools 68.2.2 pypi_0 pypi six 1.16.0 pypi_0 pypi sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.5 pypi_0 pypi soxr 0.3.7 pypi_0 pypi sqlite 3.41.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.3 pypi_0 pypi tenacity 8.2.3 pypi_0 pypi tensorboard 2.12.3 pypi_0 pypi tensorboard-data-server 0.7.2 pypi_0 pypi tensorflow 2.12.0 pypi_0 pypi tensorflow-estimator 2.12.0 pypi_0 pypi tensorflow-io-gcs-filesystem 0.34.0 pypi_0 pypi termcolor 2.3.0 pypi_0 pypi terminado 0.18.0 pypi_0 pypi threadpoolctl 3.2.0 pypi_0 pypi tifffile 2023.7.10 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main tomli 2.0.1 pypi_0 pypi toolz 0.12.0 pypi_0 pypi tornado 6.3.3 pypi_0 pypi tqdm 4.65.0 py38hb070fc8_0 https://repo.anaconda.com/pkgs/main traitlets 5.13.0 pypi_0 pypi types-python-dateutil 2.8.19.14 pypi_0 pypi typing-extensions 4.8.0 pypi_0 pypi tzdata 2023.3 pypi_0 pypi uri-template 1.3.0 pypi_0 pypi urllib3 1.26.18 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.24.0.post1 pypi_0 pypi uvloop 0.16.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.10 pypi_0 pypi webcolors 1.13 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.6.4 pypi_0 pypi werkzeug 3.0.1 pypi_0 pypi wheel 0.41.3 pypi_0 pypi widgetsnbextension 4.0.9 pypi_0 pypi wrapt 1.14.1 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.4.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main y-py 0.6.2 pypi_0 pypi yaml-cpp 0.8.0 h6a678d5_0 https://repo.anaconda.com/pkgs/main ypy-websocket 0.8.4 pypi_0 pypi zipp 3.17.0 pypi_0 pypi zlib 1.2.13 hd590300_5 conda-forge zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.5 hc292b87_0 https://repo.anaconda.com/pkgs/main ``` --- ## tensorflow:2.2.0-py36-cpu ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 1_gnu conda-forge absl-py 0.12.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.1.0 pypi_0 pypi anyio 2.2.0 pypi_0 pypi argon2-cffi 20.1.0 py36h8f6f2f9_2 conda-forge astunparse 1.6.3 pypi_0 pypi async_generator 1.10 py_0 conda-forge attrs 20.3.0 pyhd3deb0d_0 conda-forge babel 2.9.0 pypi_0 pypi backcall 0.2.0 pypi_0 pypi backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge bleach 3.3.0 pyh44b312d_0 conda-forge blis 0.7.4 pypi_0 pypi boost 1.73.0 py36_11 https://conda.anaconda.org/anaconda brotlipy 0.7.0 py36h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2020.12.5 ha878542_0 conda-forge cached-property 1.5.2 pypi_0 pypi cachetools 4.2.1 pypi_0 pypi catalogue 2.0.1 pypi_0 pypi certifi 2020.12.5 py36h5fab9bb_1 conda-forge cffi 1.14.5 py36h261ae71_0 defaults chardet 4.0.0 py36h06a4308_1003 defaults click 7.1.2 pypi_0 pypi cloudpickle 1.6.0 pypi_0 pypi conda 4.10.0 py36h5fab9bb_1 conda-forge conda-package-handling 1.7.2 py36h03888b9_0 defaults contextvars 2.4 pypi_0 pypi cryptography 3.4.6 py36hd23ed53_0 defaults cupy-cuda100 8.6.0 pypi_0 pypi cycler 0.10.0 pypi_0 pypi cymem 2.0.5 pypi_0 pypi cython 0.29.22 pypi_0 pypi dataclasses 0.8 pypi_0 pypi decorator 4.4.2 pypi_0 pypi defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.21.1 py36hde86582_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi fastai 2.0.19 pypi_0 pypi fastcore 1.3.19 pypi_0 pypi fastprogress 1.0.0 pypi_0 pypi fastrlock 0.6 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 1.1.2 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi future 0.18.2 pypi_0 pypi gast 0.3.3 pypi_0 pypi gdal 3.0.4 pypi_0 pypi google-auth 1.28.0 pypi_0 pypi google-auth-oauthlib 0.4.3 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.36.1 pypi_0 pypi h11 0.12.0 pypi_0 pypi h5py 3.1.0 pypi_0 pypi httptools 0.1.1 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 2.10 pyhd3eb1b0_0 defaults imageio 2.9.0 pypi_0 pypi imageio-ffmpeg 0.4.3 pypi_0 pypi immutables 0.15 pypi_0 pypi importlib-metadata 3.7.3 pypi_0 pypi ipykernel 5.5.3 py36hcb3619a_0 conda-forge ipython 7.16.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.3 pyhd3deb0d_0 conda-forge itsdangerous 1.1.0 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 2.11.3 pyh44b312d_0 conda-forge joblib 1.0.1 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.5 pypi_0 pypi jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter-archive 3.0.0 pypi_0 pypi jupyter-packaging 0.7.12 pypi_0 pypi jupyter-server 1.6.1 pypi_0 pypi jupyter_client 6.1.12 pyhd8ed1ab_0 conda-forge jupyter_core 4.7.1 py36h5fab9bb_0 conda-forge jupyterlab 3.0.12 pypi_0 pypi jupyterlab-execute-time 2.0.2 pypi_0 pypi jupyterlab-language-pack-zh-cn 0.0.1.dev0 pypi_0 pypi jupyterlab-server 2.4.0 pypi_0 pypi jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_widgets 1.0.0 pyhd8ed1ab_1 conda-forge keras 2.3.1 pypi_0 pypi keras-applications 1.0.8 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.3.1 pypi_0 pypi ld_impl_linux-64 2.33.1 h53a641e_7 defaults libblas 3.9.0 8_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 8_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h2828fa1_18 conda-forge libgfortran-ng 9.3.0 hff62375_18 conda-forge libgfortran5 9.3.0 hff62375_18 conda-forge libgomp 9.3.0 h2828fa1_18 conda-forge liblapack 3.9.0 8_openblas conda-forge libopenblas 0.3.12 pthreads_h4812303_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 h6de172a_18 conda-forge lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.4 pypi_0 pypi markupsafe 1.1.1 py36h8f6f2f9_3 conda-forge matplotlib 3.3.4 pypi_0 pypi mistune 0.8.4 py36h8f6f2f9_1003 conda-forge msgpack 0.6.2 pypi_0 pypi murmurhash 1.0.5 pypi_0 pypi mxnet 1.6.0 pypi_0 pypi nbclassic 0.2.7 pypi_0 pypi nbclient 0.5.3 pyhd8ed1ab_0 conda-forge nbconvert 6.0.7 py36h5fab9bb_3 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 he6710b0_1 defaults nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge networkx 2.5 pypi_0 pypi notebook 6.3.0 py36h5fab9bb_0 conda-forge numpy 1.19.5 py36h2aa4a07_1 conda-forge oauthlib 3.1.0 pypi_0 pypi onnx 1.8.1 pypi_0 pypi onnxruntime 1.7.0 pypi_0 pypi openbayes-serving 0.1.14 pypi_0 pypi openbayestool 0.3.1 pypi_0 pypi opencv-python 4.1.1.100 pypi_0 pypi opencv-python-headless 4.1.1.100 pypi_0 pypi openssl 1.1.1k h7f98852_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi packaging 20.9 pyh44b312d_0 conda-forge pandas 1.1.5 pypi_0 pypi pandoc 2.12 h7f98852_0 conda-forge pandocfilters 1.4.3 pypi_0 pypi parso 0.7.1 pypi_0 pypi pathy 0.4.0 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 6.2.2 pypi_0 pypi pip 21.0.1 py36h06a4308_0 defaults pprintpp 0.4.0 pypi_0 pypi preshed 3.0.5 pypi_0 pypi prometheus_client 0.10.1 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.18 pypi_0 pypi protobuf 3.15.6 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge py-boost 1.73.0 py36h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py36h27cfd23_0 defaults pycparser 2.20 py_2 defaults pydantic 1.7.3 pypi_0 pypi pygments 2.8.1 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd3eb1b0_1 defaults pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py36h8f6f2f9_2 conda-forge pysocks 1.7.1 py36h06a4308_0 defaults python 3.6.13 hdb3f193_0 defaults python-dateutil 2.8.1 py_0 conda-forge python-graphviz 0.16 pypi_0 pypi python_abi 3.6 1_cp36m conda-forge pytorch-ignite 0.4.4 pypi_0 pypi pytz 2021.1 pypi_0 pypi pywavelets 1.1.1 pypi_0 pypi pyyaml 5.4.1 pypi_0 pypi pyzmq 22.0.3 py36h7068817_1 conda-forge readline 8.1 h27cfd23_0 defaults requests 2.25.1 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi rsa 4.7.2 pypi_0 pypi ruamel_yaml 0.15.100 py36h27cfd23_0 defaults scikit-image 0.17.2 pypi_0 pypi scikit-learn 0.24.1 pypi_0 pypi scipy 1.4.1 pypi_0 pypi seaborn 0.11.1 pypi_0 pypi send2trash 1.5.0 py_0 conda-forge setuptools 54.2.0 pypi_0 pypi simplegeneric 0.8.1 py_1 conda-forge six 1.15.0 py36h06a4308_0 defaults smart-open 3.0.0 pypi_0 pypi sniffio 1.2.0 pypi_0 pypi spacy 3.0.5 pypi_0 pypi spacy-legacy 3.0.1 pypi_0 pypi sqlite 3.35.2 hdfb4753_0 defaults srsly 2.4.0 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.0 pypi_0 pypi tensorflow 2.2.0 pypi_0 pypi tensorflow-estimator 2.2.0 pypi_0 pypi termcolor 1.1.0 pypi_0 pypi terminado 0.9.4 py36h5fab9bb_0 conda-forge testpath 0.4.4 py_0 conda-forge thinc 8.0.2 pypi_0 pypi threadpoolctl 2.1.0 pypi_0 pypi tifffile 2020.9.3 pypi_0 pypi tk 8.6.10 hbc83047_0 defaults toolz 0.11.1 pypi_0 pypi torch 1.6.0+cpu pypi_0 pypi torchvision 0.7.0+cpu pypi_0 pypi tornado 6.1 py36h8f6f2f9_1 conda-forge tqdm 4.59.0 pyhd3eb1b0_1 defaults traitlets 4.3.3 py36h9f0ad1d_1 conda-forge typer 0.3.2 pypi_0 pypi typing 3.7.4.3 pypi_0 pypi typing_extensions 3.7.4.3 py_0 conda-forge urllib3 1.26.4 pyhd3eb1b0_0 defaults uvicorn 0.12.3 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wasabi 0.8.2 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi werkzeug 1.0.1 pypi_0 pypi wheel 0.36.2 pyhd3eb1b0_0 defaults widgetsnbextension 3.5.1 py36h5fab9bb_4 conda-forge wrapt 1.12.1 pypi_0 pypi xgboost 1.3.3 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.4.1 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7b6447c_3 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## tensorflow:2.2.0-py36-cu101 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 conda_forge conda-forge _openmp_mutex 4.5 1_gnu conda-forge absl-py 0.12.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.1.0 pypi_0 pypi anyio 2.2.0 pypi_0 pypi argon2-cffi 20.1.0 py36h8f6f2f9_2 conda-forge astunparse 1.6.3 pypi_0 pypi async_generator 1.10 py_0 conda-forge attrs 20.3.0 pyhd3deb0d_0 conda-forge babel 2.9.0 pypi_0 pypi backcall 0.2.0 pypi_0 pypi backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge bleach 3.3.0 pyh44b312d_0 conda-forge blis 0.7.4 pypi_0 pypi boost 1.73.0 py36_11 https://conda.anaconda.org/anaconda brotlipy 0.7.0 py36h27cfd23_1003 defaults bzip2 1.0.8 h7b6447c_0 https://conda.anaconda.org/anaconda ca-certificates 2020.12.5 ha878542_0 conda-forge cached-property 1.5.2 pypi_0 pypi cachetools 4.2.1 pypi_0 pypi catalogue 2.0.1 pypi_0 pypi certifi 2020.12.5 py36h5fab9bb_1 conda-forge cffi 1.14.5 py36h261ae71_0 defaults chardet 4.0.0 py36h06a4308_1003 defaults click 7.1.2 pypi_0 pypi cloudpickle 1.6.0 pypi_0 pypi conda 4.10.0 py36h5fab9bb_1 conda-forge conda-package-handling 1.7.2 py36h03888b9_0 defaults contextvars 2.4 pypi_0 pypi cryptography 3.4.6 py36hd23ed53_0 defaults cupy-cuda101 8.6.0 pypi_0 pypi cycler 0.10.0 pypi_0 pypi cymem 2.0.5 pypi_0 pypi cython 0.29.22 pypi_0 pypi dataclasses 0.8 pypi_0 pypi decorator 4.4.2 pypi_0 pypi defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge dlib 19.21.1 py36hde86582_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge enum34 1.1.10 pypi_0 pypi fastai 2.0.19 pypi_0 pypi fastcore 1.3.19 pypi_0 pypi fastprogress 1.0.0 pypi_0 pypi fastrlock 0.6 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 1.1.2 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi future 0.18.2 pypi_0 pypi gast 0.3.3 pypi_0 pypi gdal 3.0.4 pypi_0 pypi google-auth 1.28.0 pypi_0 pypi google-auth-oauthlib 0.4.3 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.36.1 pypi_0 pypi h11 0.12.0 pypi_0 pypi h5py 3.1.0 pypi_0 pypi horovod 0.21.3 pypi_0 pypi httptools 0.1.1 pypi_0 pypi icu 58.2 he6710b0_3 https://conda.anaconda.org/anaconda idna 2.10 pyhd3eb1b0_0 defaults imageio 2.9.0 pypi_0 pypi imageio-ffmpeg 0.4.3 pypi_0 pypi immutables 0.15 pypi_0 pypi importlib-metadata 3.7.3 pypi_0 pypi install 1.3.4 pypi_0 pypi ipykernel 5.5.3 py36hcb3619a_0 conda-forge ipython 7.16.1 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.3 pyhd3deb0d_0 conda-forge itsdangerous 1.1.0 pypi_0 pypi jedi 0.17.2 pypi_0 pypi jinja2 2.11.3 pyh44b312d_0 conda-forge joblib 1.0.1 pypi_0 pypi jpeg 9d h36c2ea0_0 conda-forge json5 0.9.5 pypi_0 pypi jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter-archive 3.0.0 pypi_0 pypi jupyter-packaging 0.7.12 pypi_0 pypi jupyter-server 1.6.1 pypi_0 pypi jupyter_client 6.1.12 pyhd8ed1ab_0 conda-forge jupyter_core 4.7.1 py36h5fab9bb_0 conda-forge jupyterlab 3.0.12 pypi_0 pypi jupyterlab-execute-time 2.0.2 pypi_0 pypi jupyterlab-language-pack-zh-cn 0.0.1.dev0 pypi_0 pypi jupyterlab-server 2.4.0 pypi_0 pypi jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_widgets 1.0.0 pyhd8ed1ab_1 conda-forge keras 2.3.1 pypi_0 pypi keras-applications 1.0.8 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.3.1 pypi_0 pypi ld_impl_linux-64 2.33.1 h53a641e_7 defaults libblas 3.9.0 8_openblas conda-forge libboost 1.73.0 h37e3b65_11 https://conda.anaconda.org/anaconda libcblas 3.9.0 8_openblas conda-forge libffi 3.3 he6710b0_2 defaults libgcc-ng 9.3.0 h2828fa1_18 conda-forge libgfortran-ng 9.3.0 hff62375_18 conda-forge libgfortran5 9.3.0 hff62375_18 conda-forge libgomp 9.3.0 h2828fa1_18 conda-forge liblapack 3.9.0 8_openblas conda-forge libopenblas 0.3.12 pthreads_h4812303_1 conda-forge libpng 1.6.37 h21135ba_2 conda-forge libsodium 1.0.18 h36c2ea0_1 conda-forge libstdcxx-ng 9.3.0 h6de172a_18 conda-forge lightgbm 2.3.1 pypi_0 pypi lz4-c 1.9.2 heb0550a_3 https://conda.anaconda.org/anaconda markdown 3.3.4 pypi_0 pypi markupsafe 1.1.1 py36h8f6f2f9_3 conda-forge matplotlib 3.3.4 pypi_0 pypi mistune 0.8.4 py36h8f6f2f9_1003 conda-forge msgpack 0.6.2 pypi_0 pypi murmurhash 1.0.5 pypi_0 pypi mxnet-cu101 1.6.0.post0 pypi_0 pypi nbclassic 0.2.7 pypi_0 pypi nbclient 0.5.3 pyhd8ed1ab_0 conda-forge nbconvert 6.0.7 py36h5fab9bb_3 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 he6710b0_1 defaults nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge networkx 2.5 pypi_0 pypi notebook 6.3.0 py36h5fab9bb_0 conda-forge numpy 1.19.5 py36h2aa4a07_1 conda-forge oauthlib 3.1.0 pypi_0 pypi onnx 1.8.1 pypi_0 pypi onnxruntime 1.7.0 pypi_0 pypi openbayes-serving 0.1.14 pypi_0 pypi openbayestool 0.3.1 pypi_0 pypi opencv-python 4.1.1.100 pypi_0 pypi opencv-python-headless 4.1.1.100 pypi_0 pypi openssl 1.1.1k h7f98852_0 conda-forge opt-einsum 3.3.0 pypi_0 pypi packaging 20.9 pyh44b312d_0 conda-forge pandas 1.1.5 pypi_0 pypi pandoc 2.12 h7f98852_0 conda-forge pandocfilters 1.4.3 pypi_0 pypi parso 0.7.1 pypi_0 pypi pathy 0.4.0 pypi_0 pypi pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 6.2.2 pypi_0 pypi pip 21.0.1 py36h06a4308_0 defaults pprintpp 0.4.0 pypi_0 pypi preshed 3.0.5 pypi_0 pypi prometheus_client 0.10.1 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.18 pypi_0 pypi protobuf 3.15.6 pypi_0 pypi psutil 5.8.0 pypi_0 pypi ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge py-boost 1.73.0 py36h962f231_11 https://conda.anaconda.org/anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.3 py36h27cfd23_0 defaults pycparser 2.20 py_2 defaults pydantic 1.7.3 pypi_0 pypi pygments 2.8.1 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd3eb1b0_1 defaults pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py36h8f6f2f9_2 conda-forge pysocks 1.7.1 py36h06a4308_0 defaults python 3.6.13 hdb3f193_0 defaults python-dateutil 2.8.1 py_0 conda-forge python-graphviz 0.16 pypi_0 pypi python_abi 3.6 1_cp36m conda-forge pytorch-ignite 0.4.4 pypi_0 pypi pytz 2021.1 pypi_0 pypi pywavelets 1.1.1 pypi_0 pypi pyyaml 5.4.1 pypi_0 pypi pyzmq 22.0.3 py36h7068817_1 conda-forge readline 8.1 h27cfd23_0 defaults requests 2.25.1 pyhd3eb1b0_0 defaults requests-oauthlib 1.3.0 pypi_0 pypi rsa 4.7.2 pypi_0 pypi ruamel_yaml 0.15.100 py36h27cfd23_0 defaults scikit-image 0.17.2 pypi_0 pypi scikit-learn 0.24.1 pypi_0 pypi scipy 1.4.1 pypi_0 pypi seaborn 0.11.1 pypi_0 pypi send2trash 1.5.0 py_0 conda-forge setuptools 54.2.0 pypi_0 pypi simplegeneric 0.8.1 py_1 conda-forge six 1.15.0 py36h06a4308_0 defaults smart-open 3.0.0 pypi_0 pypi sniffio 1.2.0 pypi_0 pypi spacy 3.0.5 pypi_0 pypi spacy-legacy 3.0.1 pypi_0 pypi sqlite 3.35.2 hdfb4753_0 defaults srsly 2.4.0 pypi_0 pypi tensorboard 2.2.0 pypi_0 pypi tensorboard-plugin-wit 1.8.0 pypi_0 pypi tensorflow 2.2.0 pypi_0 pypi tensorflow-estimator 2.2.0 pypi_0 pypi termcolor 1.1.0 pypi_0 pypi terminado 0.9.4 py36h5fab9bb_0 conda-forge testpath 0.4.4 py_0 conda-forge thinc 8.0.2 pypi_0 pypi threadpoolctl 2.1.0 pypi_0 pypi tifffile 2020.9.3 pypi_0 pypi tk 8.6.10 hbc83047_0 defaults toolz 0.11.1 pypi_0 pypi torch 1.6.0+cu101 pypi_0 pypi torchvision 0.7.0+cu101 pypi_0 pypi tornado 6.1 py36h8f6f2f9_1 conda-forge tqdm 4.59.0 pyhd3eb1b0_1 defaults traitlets 4.3.3 py36h9f0ad1d_1 conda-forge typer 0.3.2 pypi_0 pypi typing 3.7.4.3 pypi_0 pypi typing_extensions 3.7.4.3 py_0 conda-forge urllib3 1.26.4 pyhd3eb1b0_0 defaults uvicorn 0.12.3 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wasabi 0.8.2 pypi_0 pypi wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 pypi_0 pypi werkzeug 1.0.1 pypi_0 pypi wheel 0.36.2 pyhd3eb1b0_0 defaults widgetsnbextension 3.5.1 py36h5fab9bb_4 conda-forge wrapt 1.12.1 pypi_0 pypi xgboost 1.3.3 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.5 h7b6447c_0 defaults yaml 0.2.5 h7b6447c_0 defaults zeromq 4.3.4 h9c3ff4c_0 conda-forge zipp 3.4.1 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7b6447c_3 defaults zstd 1.4.5 h9ceee32_0 https://conda.anaconda.org/anaconda ``` --- ## tensorflow:2.7.1-py38-cu113 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main https://repo.anaconda.com/pkgs/main _openmp_mutex 5.1 1_gnu https://repo.anaconda.com/pkgs/main absl-py 1.4.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.2.2 pypi_0 pypi ansiwrap 0.8.4 pypi_0 pypi anyio 3.6.2 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asttokens 2.2.1 pypi_0 pypi astunparse 1.6.3 pypi_0 pypi attrs 22.2.0 pypi_0 pypi audioread 3.0.0 pypi_0 pypi babel 2.12.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.11.2 pypi_0 pypi bleach 6.0.0 pypi_0 pypi boost 1.73.0 py38h06a4308_12 anaconda brotlipy 0.7.0 py38h27cfd23_1003 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 anaconda ca-certificates 2023.01.10 h06a4308_0 anaconda cachetools 5.3.0 pypi_0 pypi certifi 2022.12.7 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.3 pypi_0 pypi cloudpickle 2.2.1 pypi_0 pypi comm 0.1.2 pypi_0 pypi conda 23.1.0 py38h06a4308_0 anaconda conda-content-trust 0.1.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.0.2 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.7.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.0.7 pypi_0 pypi cryptography 39.0.1 py38h9ce1e76_0 https://repo.anaconda.com/pkgs/main cycler 0.11.0 pypi_0 pypi cython 0.29.33 pypi_0 pypi debugpy 1.6.6 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.0 py38he2161a6_0 conda-forge entrypoints 0.4 pypi_0 pypi executing 1.2.0 pypi_0 pypi fastjsonschema 2.16.3 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 2.2.3 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 2.0.7 pypi_0 pypi fonttools 4.39.0 pypi_0 pypi future 0.18.3 pypi_0 pypi gast 0.4.0 pypi_0 pypi google-auth 2.16.2 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.51.3 pypi_0 pypi h11 0.14.0 pypi_0 pypi h5py 3.8.0 pypi_0 pypi httptools 0.5.0 pypi_0 pypi icu 58.2 he6710b0_3 anaconda idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.26.0 pypi_0 pypi imageio-ffmpeg 0.4.8 pypi_0 pypi importlib-metadata 6.0.0 pypi_0 pypi importlib-resources 5.12.0 pypi_0 pypi ipykernel 6.21.3 pypi_0 pypi ipython 8.11.0 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.0.4 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.18.2 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.2.0 pypi_0 pypi jpeg 9e h166bdaf_1 conda-forge json5 0.9.11 pypi_0 pypi jsonschema 4.17.3 pypi_0 pypi jupyter-archive 3.3.4 pypi_0 pypi jupyter-client 8.0.3 pypi_0 pypi jupyter-core 5.2.0 pypi_0 pypi jupyter-server 1.23.6 pypi_0 pypi jupyterlab 3.4.3 pypi_0 pypi jupyterlab-colab-bridge 0.1.5 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.6.post0 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.20.0 pypi_0 pypi jupyterlab-widgets 3.0.5 pypi_0 pypi keras 2.7.0 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.4.4 pypi_0 pypi lazy-loader 0.1 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libblas 3.9.0 15_linux64_openblas conda-forge libboost 1.73.0 h28710b8_12 anaconda libcblas 3.9.0 15_linux64_openblas conda-forge libclang 15.0.6.1 pypi_0 pypi libffi 3.4.2 h6a678d5_6 https://repo.anaconda.com/pkgs/main libgcc-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main libgfortran-ng 12.2.0 h69a702a_19 conda-forge libgfortran5 12.2.0 h337968e_19 conda-forge libgomp 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main liblapack 3.9.0 15_linux64_openblas conda-forge libopenblas 0.3.20 pthreads_h78a6416_0 conda-forge libpng 1.6.39 h5eee18b_0 https://repo.anaconda.com/pkgs/main librosa 0.10.0 pypi_0 pypi libstdcxx-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main lightgbm 2.3.1 pypi_0 pypi llvmlite 0.39.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 anaconda markdown 3.4.1 pypi_0 pypi markupsafe 2.1.2 pypi_0 pypi matplotlib 3.7.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 2.0.5 pypi_0 pypi msgpack 1.0.4 pypi_0 pypi nbclassic 0.5.3 pypi_0 pypi nbclient 0.7.2 pypi_0 pypi nbconvert 7.2.9 pypi_0 pypi nbformat 5.7.3 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.6 pypi_0 pypi networkx 3.0 pypi_0 pypi notebook-shim 0.2.2 pypi_0 pypi numba 0.56.4 pypi_0 pypi numpy 1.23.5 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi openbayes-serving 0.2.5 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1t h7f8727e_0 https://repo.anaconda.com/pkgs/main opt-einsum 3.3.0 pypi_0 pypi packaging 23.0 pypi_0 pypi pandas 1.5.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.4.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 9.4.0 pypi_0 pypi pip 23.0.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 3.1.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.7.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.16.0 pypi_0 pypi prompt-toolkit 3.0.38 pypi_0 pypi protobuf 4.22.1 pypi_0 pypi psutil 5.9.4 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h51133e4_12 anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.4 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.14.0 pypi_0 pypi pyopenssl 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.0.9 pypi_0 pypi pyrsistent 0.19.3 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.16 h7a1cb2a_3 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2022.7.1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 25.0.0 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main requests 2.28.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.20.0 pypi_0 pypi scikit-learn 1.2.1 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.12.2 pypi_0 pypi send2trash 1.8.0 pypi_0 pypi setuptools 67.5.1 pypi_0 pypi six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.4 pypi_0 pypi soxr 0.3.4 pypi_0 pypi sqlite 3.40.1 h5082296_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.2 pypi_0 pypi tenacity 8.2.2 pypi_0 pypi tensorboard 2.12.0 pypi_0 pypi tensorboard-data-server 0.7.0 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi tensorflow 2.7.1 pypi_0 pypi tensorflow-estimator 2.7.0 pypi_0 pypi tensorflow-io-gcs-filesystem 0.31.0 pypi_0 pypi termcolor 2.2.0 pypi_0 pypi terminado 0.17.1 pypi_0 pypi textwrap3 0.9.2 pypi_0 pypi threadpoolctl 3.1.0 pypi_0 pypi tifffile 2023.2.28 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main toolz 0.12.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main tornado 6.2 pypi_0 pypi tqdm 4.64.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main traitlets 5.9.0 pypi_0 pypi typing-extensions 4.5.0 pypi_0 pypi urllib3 1.26.14 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.20.0 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.6 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.5.1 pypi_0 pypi werkzeug 2.2.3 pypi_0 pypi wheel 0.38.4 pypi_0 pypi widgetsnbextension 4.0.5 pypi_0 pypi wrapt 1.15.0 pypi_0 pypi xgboost 1.7.4 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.10 h5eee18b_1 https://repo.anaconda.com/pkgs/main zipp 3.15.0 pypi_0 pypi zlib 1.2.13 h5eee18b_0 https://repo.anaconda.com/pkgs/main zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.2 ha4553b6_0 anaconda ``` --- ## tensorflow:2.8.2-py38-cu113 ## 镜像内依赖列表 ``` # packages in environment at /usr/local: # # Name Version Build Channel _libgcc_mutex 0.1 main https://repo.anaconda.com/pkgs/main _openmp_mutex 5.1 1_gnu https://repo.anaconda.com/pkgs/main absl-py 1.4.0 pypi_0 pypi accept-types 0.4.1 pypi_0 pypi altair 4.2.2 pypi_0 pypi ansiwrap 0.8.4 pypi_0 pypi anyio 3.6.2 pypi_0 pypi argon2-cffi 21.3.0 pypi_0 pypi argon2-cffi-bindings 21.2.0 pypi_0 pypi asttokens 2.2.1 pypi_0 pypi astunparse 1.6.3 pypi_0 pypi attrs 22.2.0 pypi_0 pypi audioread 3.0.0 pypi_0 pypi babel 2.12.1 pypi_0 pypi backcall 0.2.0 pypi_0 pypi beautifulsoup4 4.11.2 pypi_0 pypi bleach 6.0.0 pypi_0 pypi boost 1.73.0 py38h06a4308_12 anaconda brotlipy 0.7.0 py38h27cfd23_1003 https://repo.anaconda.com/pkgs/main bzip2 1.0.8 h7b6447c_0 anaconda ca-certificates 2023.01.10 h06a4308_0 anaconda cachetools 5.3.0 pypi_0 pypi certifi 2022.12.7 py38h06a4308_0 anaconda cffi 1.15.1 py38h5eee18b_3 https://repo.anaconda.com/pkgs/main charset-normalizer 2.0.4 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main click 8.1.3 pypi_0 pypi cloudpickle 2.2.1 pypi_0 pypi comm 0.1.2 pypi_0 pypi conda 23.1.0 py38h06a4308_0 anaconda conda-content-trust 0.1.3 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-handling 2.0.2 py38h06a4308_0 https://repo.anaconda.com/pkgs/main conda-package-streaming 0.7.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main contourpy 1.0.7 pypi_0 pypi cryptography 39.0.1 py38h9ce1e76_0 https://repo.anaconda.com/pkgs/main cycler 0.11.0 pypi_0 pypi cython 0.29.33 pypi_0 pypi debugpy 1.6.6 pypi_0 pypi decorator 5.1.1 pypi_0 pypi defusedxml 0.7.1 pypi_0 pypi dlib 19.24.0 py38he2161a6_0 conda-forge entrypoints 0.4 pypi_0 pypi executing 1.2.0 pypi_0 pypi fastjsonschema 2.16.3 pypi_0 pypi ffmpeg-python 0.2.0 pypi_0 pypi flask 2.2.3 pypi_0 pypi flask-cors 3.0.10 pypi_0 pypi flatbuffers 23.3.3 pypi_0 pypi fonttools 4.39.0 pypi_0 pypi future 0.18.3 pypi_0 pypi gast 0.5.3 pypi_0 pypi google-auth 2.16.2 pypi_0 pypi google-auth-oauthlib 0.4.6 pypi_0 pypi google-pasta 0.2.0 pypi_0 pypi grpcio 1.51.3 pypi_0 pypi h11 0.14.0 pypi_0 pypi h5py 3.8.0 pypi_0 pypi httptools 0.5.0 pypi_0 pypi icu 58.2 he6710b0_3 anaconda idna 3.4 py38h06a4308_0 https://repo.anaconda.com/pkgs/main imageio 2.26.0 pypi_0 pypi imageio-ffmpeg 0.4.8 pypi_0 pypi importlib-metadata 6.0.0 pypi_0 pypi importlib-resources 5.12.0 pypi_0 pypi ipykernel 6.21.3 pypi_0 pypi ipython 8.11.0 pypi_0 pypi ipython-genutils 0.2.0 pypi_0 pypi ipywidgets 8.0.4 pypi_0 pypi itsdangerous 2.1.2 pypi_0 pypi jedi 0.18.2 pypi_0 pypi jinja2 3.1.2 pypi_0 pypi joblib 1.2.0 pypi_0 pypi jpeg 9e h166bdaf_1 conda-forge json5 0.9.11 pypi_0 pypi jsonschema 4.17.3 pypi_0 pypi jupyter-archive 3.3.4 pypi_0 pypi jupyter-client 8.0.3 pypi_0 pypi jupyter-core 5.2.0 pypi_0 pypi jupyter-server 1.23.6 pypi_0 pypi jupyterlab 3.4.3 pypi_0 pypi jupyterlab-colab-bridge 0.1.5 pypi_0 pypi jupyterlab-execute-time 2.3.1 pypi_0 pypi jupyterlab-language-pack-zh-cn 3.6.post0 pypi_0 pypi jupyterlab-notifications 0.4.1 pypi_0 pypi jupyterlab-pygments 0.2.2 pypi_0 pypi jupyterlab-server 2.20.0 pypi_0 pypi jupyterlab-widgets 3.0.5 pypi_0 pypi keras 2.8.0 pypi_0 pypi keras-preprocessing 1.1.2 pypi_0 pypi kiwisolver 1.4.4 pypi_0 pypi lazy-loader 0.1 pypi_0 pypi ld_impl_linux-64 2.38 h1181459_1 https://repo.anaconda.com/pkgs/main libblas 3.9.0 15_linux64_openblas conda-forge libboost 1.73.0 h28710b8_12 anaconda libcblas 3.9.0 15_linux64_openblas conda-forge libclang 15.0.6.1 pypi_0 pypi libffi 3.4.2 h6a678d5_6 https://repo.anaconda.com/pkgs/main libgcc-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main libgfortran-ng 12.2.0 h69a702a_19 conda-forge libgfortran5 12.2.0 h337968e_19 conda-forge libgomp 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main liblapack 3.9.0 15_linux64_openblas conda-forge libopenblas 0.3.20 pthreads_h78a6416_0 conda-forge libpng 1.6.39 h5eee18b_0 https://repo.anaconda.com/pkgs/main librosa 0.10.0 pypi_0 pypi libstdcxx-ng 11.2.0 h1234567_1 https://repo.anaconda.com/pkgs/main lightgbm 2.3.1 pypi_0 pypi llvmlite 0.39.1 pypi_0 pypi lz4-c 1.9.4 h6a678d5_0 anaconda markdown 3.4.1 pypi_0 pypi markupsafe 2.1.2 pypi_0 pypi matplotlib 3.7.1 pypi_0 pypi matplotlib-inline 0.1.6 pypi_0 pypi mistune 2.0.5 pypi_0 pypi msgpack 1.0.4 pypi_0 pypi nbclassic 0.5.3 pypi_0 pypi nbclient 0.7.2 pypi_0 pypi nbconvert 7.2.9 pypi_0 pypi nbformat 5.7.3 pypi_0 pypi ncurses 6.4 h6a678d5_0 https://repo.anaconda.com/pkgs/main nest-asyncio 1.5.6 pypi_0 pypi networkx 3.0 pypi_0 pypi notebook-shim 0.2.2 pypi_0 pypi numba 0.56.4 pypi_0 pypi numpy 1.23.5 pypi_0 pypi oauthlib 3.2.2 pypi_0 pypi openbayes-serving 0.2.5 pypi_0 pypi openbayestool 0.3.2 pypi_0 pypi opencv-python 4.5.3.100 pypi_0 pypi opencv-python-headless 4.5.3.100 pypi_0 pypi openssl 1.1.1t h7f8727e_0 https://repo.anaconda.com/pkgs/main opt-einsum 3.3.0 pypi_0 pypi packaging 23.0 pypi_0 pypi pandas 1.5.3 pypi_0 pypi pandocfilters 1.5.0 pypi_0 pypi papermill 2.4.0 pypi_0 pypi parso 0.8.3 pypi_0 pypi pexpect 4.8.0 pypi_0 pypi pickleshare 0.7.5 pypi_0 pypi pillow 9.4.0 pypi_0 pypi pip 23.0.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pkgutil-resolve-name 1.3.10 pypi_0 pypi platformdirs 3.1.0 pypi_0 pypi pluggy 1.0.0 py38h06a4308_1 https://repo.anaconda.com/pkgs/main pooch 1.7.0 pypi_0 pypi pprintpp 0.4.0 pypi_0 pypi prometheus-client 0.16.0 pypi_0 pypi prompt-toolkit 3.0.38 pypi_0 pypi protobuf 3.19.6 pypi_0 pypi psutil 5.9.4 pypi_0 pypi ptyprocess 0.7.0 pypi_0 pypi pure-eval 0.2.2 pypi_0 pypi py-boost 1.73.0 py38h51133e4_12 anaconda pyasn1 0.4.8 pypi_0 pypi pyasn1-modules 0.2.8 pypi_0 pypi pycosat 0.6.4 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main pycparser 2.21 pyhd3eb1b0_0 https://repo.anaconda.com/pkgs/main pygments 2.14.0 pypi_0 pypi pyopenssl 23.0.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main pyparsing 3.0.9 pypi_0 pypi pyrsistent 0.19.3 pypi_0 pypi pysocks 1.7.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main python 3.8.16 h7a1cb2a_3 https://repo.anaconda.com/pkgs/main python-dateutil 2.8.2 pypi_0 pypi python-graphviz 0.20.1 pypi_0 pypi python_abi 3.8 2_cp38 conda-forge pytz 2022.7.1 pypi_0 pypi pywavelets 1.4.1 pypi_0 pypi pyyaml 6.0 pypi_0 pypi pyzmq 25.0.0 pypi_0 pypi readline 8.2 h5eee18b_0 https://repo.anaconda.com/pkgs/main requests 2.28.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main requests-oauthlib 1.3.1 pypi_0 pypi rsa 4.9 pypi_0 pypi ruamel.yaml 0.17.21 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main ruamel.yaml.clib 0.2.6 py38h5eee18b_1 https://repo.anaconda.com/pkgs/main scikit-image 0.20.0 pypi_0 pypi scikit-learn 1.2.1 pypi_0 pypi scipy 1.10.1 pypi_0 pypi seaborn 0.12.2 pypi_0 pypi send2trash 1.8.0 pypi_0 pypi setuptools 67.5.1 pypi_0 pypi six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main sniffio 1.3.0 pypi_0 pypi soundfile 0.12.1 pypi_0 pypi soupsieve 2.4 pypi_0 pypi soxr 0.3.4 pypi_0 pypi sqlite 3.40.1 h5082296_0 https://repo.anaconda.com/pkgs/main stack-data 0.6.2 pypi_0 pypi tenacity 8.2.2 pypi_0 pypi tensorboard 2.8.0 pypi_0 pypi tensorboard-data-server 0.6.1 pypi_0 pypi tensorboard-plugin-wit 1.8.1 pypi_0 pypi tensorflow 2.8.2 pypi_0 pypi tensorflow-estimator 2.8.0 pypi_0 pypi tensorflow-io-gcs-filesystem 0.31.0 pypi_0 pypi termcolor 2.2.0 pypi_0 pypi terminado 0.17.1 pypi_0 pypi textwrap3 0.9.2 pypi_0 pypi threadpoolctl 3.1.0 pypi_0 pypi tifffile 2023.2.28 pypi_0 pypi tinycss2 1.2.1 pypi_0 pypi tk 8.6.12 h1ccaba5_0 https://repo.anaconda.com/pkgs/main toolz 0.12.0 py38h06a4308_0 https://repo.anaconda.com/pkgs/main tornado 6.2 pypi_0 pypi tqdm 4.64.1 py38h06a4308_0 https://repo.anaconda.com/pkgs/main traitlets 5.9.0 pypi_0 pypi typing-extensions 4.5.0 pypi_0 pypi urllib3 1.26.14 py38h06a4308_0 https://repo.anaconda.com/pkgs/main uvicorn 0.20.0 pypi_0 pypi uvloop 0.14.0 pypi_0 pypi vega-datasets 0.9.0 pypi_0 pypi wcwidth 0.2.6 pypi_0 pypi webencodings 0.5.1 pypi_0 pypi websocket-client 1.5.1 pypi_0 pypi werkzeug 2.2.3 pypi_0 pypi wheel 0.38.4 pypi_0 pypi widgetsnbextension 4.0.5 pypi_0 pypi wrapt 1.15.0 pypi_0 pypi xgboost 1.7.4 pypi_0 pypi xlrd 2.0.1 pypi_0 pypi xz 5.2.10 h5eee18b_1 https://repo.anaconda.com/pkgs/main zipp 3.15.0 pypi_0 pypi zlib 1.2.13 h5eee18b_0 https://repo.anaconda.com/pkgs/main zstandard 0.19.0 py38h5eee18b_0 https://repo.anaconda.com/pkgs/main zstd 1.5.2 ha4553b6_0 anaconda ``` --- ## 磁盘性能 ## 主要影响性能的因素 - 存储节点的总磁盘数,磁盘数越多性能越好 - 存储节点的内存,内存越多可以缓存的内容也就越多 - 千兆网络一定会成为瓶颈,至少保证万兆网络 ## 集群配置 因为每个集群的存储系统差异非常大,这里的性能测试都是基于某个正在使用的集群,配置如下: - 存储节点 4 个 - 两个存储节点有 22 块硬盘 HDD - 两个存储节点有 24 块硬盘 NVME SSD - 内网是 100 Gbps 以太网 ## 概念解释 IO 深度(`iodepth`):一个测试进程的最大「飞行中」请求数(或者说,已经提交但是还没有被处理完毕的请求数)。测试进程不允许在飞行中请求数大于 IO 深度的情况下继续提交请求。 进程数(`procs`):同时进行测试的进程数。 读写模式(`mode`):`read` 表示读,`write` 表示写,`rw` 表示读写交替进行。`rand` 前缀表示随机读写,否则是顺序读写。 块大小(`block size`、`bs`):单次 IO 请求的数据块的大小。`4k` 的情况出现在读写配置文件,读写细碎的小文件时会出现。`4M` 的情况会在读写大型压缩包,视频文件等等情况出现。 IOPS: IO per second,每秒钟处理的请求数。 吞吐:每秒钟取/写入的数据量 ## 临时存储空间性能测试命令 ```bash fio --name=disktest \ --ioengine=libaio \ --iodepth=$IODEPTH \ --numjobs=$PROCS \ --rw=$MODE \ --bs=$BLOCK_SIZE \ --direct=1 --buffered=0 \ --size=2G \ --runtime=30 \ --time_based \ --group_reporting \ --output-format=json ``` ## 临时存储空间性能原始数据(Markdown Table) ### randread-4096k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 126 | 520061 | 426 | 1748030 | | 2 | 304 | 1248967 | 778 | 3188892 | | 4 | 559 | 2291090 | 1307 | 5356874 | | 8 | 969 | 3969714 | 1725 | 7068748 | | 16 | 1427 | 5848223 | 1909 | 7821321 | ### randread-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 3020 | 12082 | 16193 | 64775 | | 2 | 7455 | 29820 | 33748 | 134994 | | 4 | 16418 | 65673 | 55064 | 220256 | | 8 | 30051 | 120206 | 81464 | 325858 | | 16 | 46003 | 184013 | 100042 | 400169 | ### randwrite-4096k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 73 | 302823 | 322 | 1320913 | | 2 | 165 | 677479 | 573 | 2347111 | | 4 | 318 | 1306359 | 738 | 3024103 | | 8 | 560 | 2296298 | 734 | 3006495 | | 16 | 679 | 2781767 | 712 | 2916747 | ### randwrite-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 1073 | 4295 | 4958 | 19833 | | 2 | 2538 | 10154 | 10512 | 42051 | | 4 | 5149 | 20598 | 12185 | 48742 | | 8 | 10077 | 40310 | 13810 | 55243 | | 16 | 11860 | 47442 | 13954 | 55816 | ### read-4096k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 146 | 601991 | 429 | 1760604 | | 2 | 322 | 1321316 | 757 | 3101721 | | 4 | 568 | 2329575 | 1336 | 5475449 | | 8 | 1139 | 4667606 | 1809 | 7411361 | | 16 | 1623 | 6649143 | 1930 | 7905593 | ### read-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 5915 | 23662 | 21667 | 86669 | | 2 | 10353 | 41415 | 36118 | 144473 | | 4 | 13395 | 53582 | 44638 | 178554 | | 8 | 18197 | 72790 | 45744 | 182978 | | 16 | 17317 | 69270 | 52815 | 211260 | ### write-4096k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 79 | 324731 | 305 | 1250987 | | 2 | 162 | 664409 | 560 | 2297117 | | 4 | 316 | 1298062 | 742 | 3042146 | | 8 | 536 | 2198642 | 747 | 3060965 | | 16 | 689 | 2824581 | 734 | 3007579 | ### write-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 1771 | 7084 | 5591 | 22367 | | 2 | 2218 | 8872 | 6585 | 26342 | | 4 | 2291 | 9164 | 7409 | 29639 | | 8 | 2626 | 10504 | 8351 | 33404 | | 16 | 2702 | 10810 | 8975 | 35900 | ## 数据集性能测试命令 在**读写绑定**的数据集目录(例如 `/input0`)下进行测试,避免只读挂载导致写入测试结果失真或失败。 先在绑定目录中生成测试文件: ```bash TEST_FILE_SIZE=2G fallocate -l "$TEST_FILE_SIZE" /input0/storage-perf-test.bin ``` 然后使用该文件进行 fio 压测: ```bash fio --name=disktest \ --ioengine=libaio \ --iodepth=$IODEPTH \ --numjobs=$PROCS \ --rw=$MODE \ --bs=$BLOCK_SIZE \ --direct=1 --buffered=0 \ --filename=/input0/storage-perf-test.bin \ --runtime=30 \ --time_based \ --group_reporting \ --output-format=json ``` ## 数据集性能原始数据(Markdown Table) ### randread-4M | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 101 | 413804 | 631 | 2587335 | | 2 | 257 | 1053077 | 1123 | 4603256 | | 4 | 538 | 2206346 | 1854 | 7597947 | | 8 | 1013 | 4150740 | 2368 | 9702071 | | 16 | 1688 | 6916648 | 2533 | 10376288 | ### randread-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 1989 | 7957 | 16994 | 67976 | | 2 | 5506 | 22027 | 37414 | 149656 | | 4 | 15275 | 61103 | 72562 | 290250 | | 8 | 32570 | 130280 | 121578 | 486312 | | 16 | 51385 | 205543 | 158566 | 634264 | ### read-4096k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 116 | 477602 | 598 | 2449437 | | 2 | 296 | 1213209 | 1112 | 4555812 | | 4 | 624 | 2557389 | 1911 | 7827662 | | 8 | 1145 | 4693077 | 2390 | 9791759 | | 16 | 1767 | 7239251 | 2758 | 11298102 | ### read-4k | iodepth | IOPS (procs=1) | BW KiB/s (procs=1) | IOPS (procs=4) | BW KiB/s (procs=4) | | --- | ---: | ---: | ---: | ---: | | 1 | 6948 | 27795 | 14518 | 58074 | | 2 | 11524 | 46099 | 33823 | 135293 | | 4 | 15004 | 60017 | 45936 | 183744 | | 8 | 18632 | 74531 | 61008 | 244033 | | 16 | 22928 | 91715 | 78128 | 312515 | --- ## 快速上手(Serving) 本文将通过一个实际的例子,演示如何在 OpenBayes 上使用 vLLM 部署大语言模型。我们将部署 [DeepSeek-R1-Distill-Qwen-1.5B](https://openbayes.com/console/public/models/4XlNtmtNLOf/1/overview) 模型,这是一个基于 Qwen 的轻量级模型。 ## 模型介绍 DeepSeek-R1-Distill-Qwen-1.5B 是一个轻量级的中英双语对话模型: - 1.5B 参数量,单卡即可部署 - 最小显存要求:3GB - 推荐显存配置:4GB 及以上 ![distill 1.5b](/img/docs/serving-public-model.png) ## 在模型训练中开发和测试 ### 创建一个新的模型训练 - 选择 RTX 4090 算力 - 选择 vLLM 0.7.2 基础镜像 - 在数据绑定中选择 DeepSeek-R1-Distill-Qwen-1.5B 模型,绑定到 `/openbayes/input/input0` ![选择算力为 4090](/img/docs/gear-select-resource.png) ![选择镜像为 vllm 0.7.2](/img/docs/gear-select-image.png) ![绑定 1.5b 的模型](/img/docs/gear-add-databinding.png) ### 准备启动脚本 `start.sh` 容器启动后,准备如下的 `start.sh` 脚本。 ```bash title="start.sh" #!/bin/bash # 获取 GPU 数量 GPU_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader | wc -l) # 设置端口,模型部署默认暴露的端口为 80 而模型训练默认暴露的端口为 8080 PORT=8080 if [ ! -z "$OPENBAYES_SERVING_PRODUCTION" ]; then PORT=80 fi # 启动 vLLM 服务 echo "Starting vLLM service..." vllm serve /openbayes/input/input0 \ --served-model-name DeepSeek-R1-Distill-Qwen-1.5B \ --disable-log-requests \ --trust-remote-code \ --host 0.0.0.0 --port $PORT \ --gpu-memory-utilization 0.98 \ --max-model-len 8192 --enable-prefix-caching \ --tensor-parallel-size $GPU_COUNT ``` ### 在容器中测试服务 ```bash bash start.sh ``` ![test vllm](/img/docs/gear-vllm-test.png) 下面是一个测试模型推理的 curl 请求示例: ```bash curl -X POST http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "DeepSeek-R1-Distill-Qwen-1.5B", "messages": [ { "role": "user", "content": "请用中文解释什么是大语言模型" } ], "temperature": 0.7, "max_tokens": 100 }' ``` 在 Jupyter 中打开一个新的终端(Terminal),粘贴上面的 curl 命令进行测试: ![jupyter terminal](/img/docs/jupyter-vllm-curl-test.png) :::note 在模型训练中测试时使用的是 8080 端口,但在模型部署中会自动切换到 80 端口。这是因为 OpenBayes 的模型部署服务要求必须使用 80 端口对外提供服务。 ::: ## 部署模型服务 完成模型训练和测试后,可以通过以下两种方式将模型转化为可访问的部署服务: ### 方式一:一键部署模型(推荐) OpenBayes 提供了便捷的"一键部署"功能,让你无需重复配置即可快速将模型训练转化为模型部署服务。 #### 使用一键部署功能 1. 在模型训练详情页面,找到右上角的"一键部署"按钮 2. 确认部署配置信息(系统会自动继承训练容器的配置) 3. 点击"确认部署",系统会自动创建对应的模型部署服务 ![一键部署入口](/img/docs/one-click-deploy-button.png) #### 部署配置确认 系统会自动从原训练容器继承以下配置: - 算力资源设置 - 基础镜像 - 工作空间数据 - 数据绑定关系 你可以在确认页面根据需要调整这些配置。 ![部署配置确认](/img/docs/one-click-deploy-confirm.png) #### 部署成功 提交后,系统会自动创建模型部署并启动服务。成功后会跳转到模型部署详情页,你可以立即使用在线测试工具验证接口。 ![部署成功](/img/docs/one-click-deploy-success.png) ### 方式二:手动创建模型部署 如果你需要更灵活地配置部署环境,或者想从头开始创建模型部署,可以按照以下步骤手动创建: #### 选择算力 - 选择镜像 - 绑定数据 - 选择 RTX 4090 算力 - 选择 vLLM 0.7.2 基础镜像 - 在数据绑定中选择 DeepSeek-R1-Distill-Qwen-1.5B 模型,绑定到 `/openbayes/input/input0` - 将刚才容器的工作空间绑定到 `/openbayes/home` :::tip 创建 ServingVersion 时,必须至少有一个绑定挂载到 `/openbayes/home`(即 `/output`)。这个绑定源中还需要包含 `start.sh`,否则部署无法启动。 ::: ![创建 serving](/img/docs/serving-resource.png) ![选择镜像](/img/docs/serving-image.png) ![绑定数据](/img/docs/serving-databinding-deepseek-1.5.png) ### 启动部署 点击「部署」等待模型部署变更为运行中。 ![模型部署运行成功](/img/docs/serving-running.png) 点击运行的模型部署版本,可以看到当前部署的详细内容已经日志。 ![模型部署版本详情页面](/img/docs/serving-version-detail-head.png) ![模型部署版本日志页面](/img/docs/serving-version-logs.png) ## 在线测试 在模型部署详情页,OpenBayes 提供了一个在线测试工具,方便你在网页端可视化地编写和发送 HTTP 请求,快速测试模型接口,无需本地命令行或第三方工具。 你可以: - 选择请求方法(如 GET、POST) - 填写接口路径和参数 - 自定义请求头和请求体(支持 JSON 等格式) - 一键发送请求,实时查看响应内容和响应头 - 支持流式输出,体验大模型的流式推理效果 ### GET 请求示例 用于获取模型信息或健康检查。选择 GET 方法,填写接口路径(如 `/v1/models`),点击发送即可查看模型列表或状态等信息。 ![在线测试工具 GET 示例](/img/docs/online-test-get-example.png) ### POST 请求示例 用于与大语言模型进行对话。选择 POST 方法,路径填写 `/v1/chat/completions`,在请求体中输入对话内容(如下所示),点击发送即可体验模型回复。 ```json { "model": "qwen3-32b", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "北京的天气如何?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Get the current weather in a given location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g., San Francisco, CA" }, "unit": { "type": "string", "enum": [ "celsius", "fahrenheit" ], "description": "The temperature unit to use" } }, "required": [ "location" ] } } } ], "tool_choice": "auto" } ``` ![在线测试工具 LLM 示例](/img/docs/online-test-llm-example.png) ### 流式调用示例 用于体验大模型的流式推理效果。只需在 POST 请求体中添加 `"stream": true` 字段,发送请求后即可实时看到模型逐步输出的内容,适合需要边生成边消费结果的场景。 ```json { "model": "qwen3-32b", "stream": true, "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "北京的天气如何?" } ], "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "Get the current weather in a given location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g., San Francisco, CA" }, "unit": { "type": "string", "enum": [ "celsius", "fahrenheit" ], "description": "The temperature unit to use" } }, "required": [ "location" ] } } } ], "tool_choice": "auto" } ``` ![在线测试工具 流式调用示例](/img/docs/online-test-stream-example.png) ## 命令行测试 如果你更习惯使用命令行工具(如 curl),也可以参考以下方法进行接口测试: 在模型部署页面上可以看到 OpenBayes 为模型部署生成的 url,复制 url 使用下面的命令行测试模型是否可用。 ```bash curl -X POST http://<模型部署的 url>/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "DeepSeek-R1-Distill-Qwen-1.5B", "messages": [ { "role": "user", "content": "你好,请介绍一下自己" } ], "temperature": 0.7, "max_tokens": 100 }' ``` ![curl test](/img/docs/curl-test-serving.png) ## 下一步 - 了解更多 [模型部署的管理](/docs/serving/manage-servings/) - 查看 [vLLM 官方文档](https://vllm.readthedocs.io/) --- ## 依赖管理 如果需要安装额外的依赖,可以按照以下的方式做配置。这些配置文件会在部署服务启动时自动执行,无需手动干预。 ## 工作空间与模型部署的依赖管理 在进行模型部署之前,通常建议先在「工作空间」中完成模型的开发和测试。这样做有以下几个好处: 1. 可以在工作空间中交互式地安装和测试依赖 2. 使用 `pip install --user` 或创建独立环境(Conda / uv)的方式准备好所需的依赖环境 3. 环境准备好后,可以直接将工作空间的目录(`/openbayes/home`)绑定到模型部署中使用 4. 避免在模型部署阶段重复安装依赖,提高部署效率 ### 最佳实践流程 1. 在工作空间中: - 使用 `pip install --user xxx` 安装 Python 包到 `/openbayes/home/.pylibs` - 或创建独立环境到 `/openbayes/home/your_env_name`(内置 Conda 的运行时用 `conda create`,uv 运行时用 `uv venv`,见[用 uv 管理 Python 环境](/docs/gear/uv)) - 完成模型开发和测试 2. 在模型部署时: - 将工作空间的 `/openbayes/home` 目录绑定到模型部署 - 如果使用自定义环境,需要在 `start.sh` 中激活该环境 - 模型部署将自动继承工作空间中准备好的依赖环境 这种方式特别适合需要复杂依赖环境的模型部署场景。 ## 依赖管理方式概览 ### 1. PyPI 依赖管理 #### 通过 requirements.txt 安装 在模型部署文件夹的根目录下如果存在名为 `requirements.txt` 的文件,OpenBayes 模型部署在启动前会自动执行 `pip install -r requirements.txt` 命令,安装其中声明的 PyPI 库。 文件格式遵循标准的 Python requirements.txt 格式,示例: ```txt title="requirements.txt" jieba tqdm==4.11.2 ``` #### 使用 pip --user 安装持久化依赖 - 使用 `pip install --user xxx` 命令安装的依赖会保存在 `/openbayes/home/.pylibs` 目录下 - 这些依赖在容器重启后依然可用 - 注意: 在新创建的独立环境(conda 或 uv venv)中不要使用 `--user` 参数,避免依赖冲突 ### 2. Conda 依赖管理 #### 通过 conda-packages.txt 安装 OpenBayes 模型部署支持 Conda 包的安装。在部署服务启动之前会自动在部署目录的根目录下查找名为 `conda-packages.txt` 的文件,其文件格式遵循: ```txt [channel::]package[=version[=buildid]] ``` :::note `conda-packages.txt` 仅在内置 Conda 的运行时中有效;使用 uv 的运行时(Ubuntu 24.04 及更新)请改用 `requirements.txt`。 ::: 示例: ```txt title="conda-packages.txt" conda-forge::rdkit conda-forge::pygpu ``` #### 创建自定义 Conda 环境 - 可以在 `/openbayes/home` 下创建新的 conda 环境 - 示例: ```bash conda create -p /openbayes/home/open-mmlab python=3.9 -y conda activate /openbayes/home/open-mmlab ``` #### 在 start.sh 中激活 Conda 环境 :::note 内置 Conda 的运行时(Ubuntu 22.04 及更早)中,`start.sh` 通常需要先激活默认的 base 环境,即使不使用自定义的 conda 环境。使用 uv 的运行时见下一节。 ::: 如果使用自定义的 conda 环境,需要在 `start.sh` 中明确激活该环境。示例: ```bash title="start.sh" #!/bin/bash # 首先激活默认的 base 环境 source /usr/local/etc/profile.d/conda.sh conda activate base # 如果使用自定义环境,继续激活自定义环境 conda activate /openbayes/home/open-mmlab # 启动模型服务 python app.py ``` :::note 如果不使用自定义 conda 环境,而是使用系统默认环境或通过 `pip install --user` 安装的依赖,仍然需要激活 base 环境,但不需要额外的环境激活步骤。 ::: #### uv 运行时:start.sh 通常无需激活环境 使用 uv 的运行时(Ubuntu 24.04 及更新,如 `vllm 0.20` 及之后)中,默认环境开箱即用:`start.sh` 不需要任何激活步骤(也不需要 conda 运行时那样先激活 base),直接写启动命令即可;通过 `pip install --user` 准备的依赖会自动生效。 只有一种情况需要额外一行:你在工作空间自建了独立的 uv 环境并希望部署使用它,此时在 `start.sh` 开头 source 激活: ```bash title="start.sh" #!/bin/bash # 激活自定义环境 source /openbayes/home/myenv/bin/activate # 启动模型服务 python app.py ``` ### 3. 系统依赖管理 #### 通过 dependencies.sh 安装 对于非 Conda 和 PyPI 的依赖,可以在根目录提供一个名为 `dependencies.sh` 的文件,在模型部署启动时它会自动被 `bash` 执行,并且其执行会早于 `requirements.txt` 和 `conda-packages.txt` 依赖的安装。 示例: ```bash title="dependencies.sh" apt update && apt install tree -y ``` ## 依赖安装顺序 当多个依赖配置文件同时存在时,安装顺序为: 1. `dependencies.sh` 2. `conda-packages.txt` 3. `requirements.txt` ## 最佳实践建议 1. 对于需要持久化的 Python 依赖: - 使用 `pip install --user xxx` 安装到用户目录 - 在 `/openbayes/home` 下创建自定义独立环境(Conda 或 uv) - 在代码仓库中包含 requirements.txt/conda-packages.txt 文件 - 如果使用自定义环境,确保在 `start.sh` 中正确激活环境 2. 对于系统依赖: - 将安装命令保存在 dependencies.sh 中 - 每次容器启动时会自动执行 3. 注意事项: - 系统盘上的依赖在容器重启后会丢失 - 工作目录 `/openbayes/home` 中的内容会持久化保存 - 建议将重要依赖环境保存在工作目录中 - 使用自定义 conda 环境时,确保 `start.sh` 中的环境路径正确 --- ## 模型部署的管理 ## 模型部署版本的状态 - `准备中` 正在启动 - `运行中` 已经启动了,可以查看其运行的日志 - `正在关闭` 处于关闭的清理状态 - `已关闭` 该服务版本已经被成功关闭 - `执行出错` 由于某些特殊原因异常关闭了,可以尝试通过日志查看具体原因 其中处于 `执行出错` 和 `已关闭` 状态的模型部署版本成为非活跃状态,允许该版本被再次启动或者永久删除。 ## 模型部署的监控指标 模型部署支持两种数据监控。 ### 系统指标监控 ![模型部署 - 系统指标](/img/docs/serving-system-stats.png) #### 系统监控指标说明 系统监控界面主要展示三类重要的资源使用指标: #### CPU 利用率 - 分为用户态(user)和系统态(system)两种使用情况 - 显示总核心数配置 - 通过时间序列曲线展示 CPU 使用率的变化趋势 #### 内存使用情况 - 显示当前已使用内存和总内存容量 - 计算得出内存使用率百分比 - 图表展示内存使用量的实时变化 #### GPU 使用情况 - 监控每个 GPU 设备的使用情况 - 包含两个关键指标: - util: GPU 计算单元的使用率 - vram: GPU 显存的使用情况 - 鼠标悬停时可查看某个时间点的具体数值: - 核心使用率百分比 - 显存使用量 这些指标以图表形式直观展示,帮助用户监控服务运行状态和资源使用趋势,便于及时发现潜在的性能问题。 ### 请求用量监控 ![模型部署 - 请求指标](/img/docs/serving-request-stats.png) 请求监控界面展示了服务的请求处理性能指标,包含以下关键维度: #### 请求数量统计 - 以柱状图形式展示请求数量(count)的时间分布 - 可选择不同的时间区间(5分钟、15分钟、30分钟等)查看统计数据 #### 请求时间统计 通过多条曲线展示不同维度的请求处理时间指标: - avg: 平均响应时间 - max: 最大响应时间 - 分位数统计: - p50: 50分位数响应时间 - p75: 75分位数响应时间 - p90: 90分位数响应时间 - p95: 95分位数响应时间 - p99: 99分位数响应时间 #### 数据查看方式 - 鼠标悬停可查看具体时间点的详细指标数据 - 支持查看指定时间范围内的请求统计 - 可通过图例选择显示/隐藏特定指标 - 右上角显示当前选中时间段的请求总数和各项统计指标 这些指标帮助用户全面了解服务的性能表现,可用于: - 评估服务响应时间 - 发现性能瓶颈 - 分析请求处理能力 - 监控服务质量 ## API Key 管理 默认情况下,模型部署服务是公开访问的,无需认证即可调用。你可以在模型部署的设置页面中开启访问控制,启用 API Key 认证机制: 开启访问控制后,模型部署支持两种类型的 API Key 进行访问认证: 1. 用户级别的 API Key - 可访问用户下的所有模型部署 2. 模型部署级别的 API Key - 仅可访问指定的一个或多个模型部署 你可以在模型部署的设置页面中管理 API Key: :::caution 注意 API Key 的创建、更新或删除操作可能需要最多 5 分钟才能生效。 ::: 关于 API Key 的详细管理和使用说明,请参考 [API Key 管理](/docs/serving/api-key-management)。 ## 在线测试 每个模型部署页面都内置了"在线测试工具",支持直接在浏览器中调试 API。你可以: - 选择请求方法(GET/POST) - 填写请求路径和参数 - 支持流式输出和多种 Content-Type - 实时查看响应内容和响应头 这对于快速验证模型服务、调试接口参数非常方便。详见部署详情页的「版本测试」区域。 ## 模型部署的扩容 在创建模型部署是可以选择副本个数,副本个数越多,服务的负载能力越高。 ![](/img/docs/managing-serving-1.png) 在一个运行中的模型部署版本的「设置」页面可以更新其副本个数。 ![](/img/docs/managing-serving-2.png) 扩容后会展示多个实例。 ![模型部署 - 多个实例](/img/docs/serving-multi-instance-detail.png) 在日志里也会展示每一个实例的日志: ![模型部署 - 多个实例日志](/img/docs/serving-multi-instance-detail-logs.png) 同时系统指标也会按照实例个数分别展示: ![模型部署 - 多个实例 - 指标展示 1](/img/docs/serving-metrics-multi-instance-1.png) ![模型部署 - 多个实例 - 指标展示 2](/img/docs/serving-metrics-multi-instance-2.png) :::caution 注意 副本个数越多,服务负载能力越强,也意味着同样时间其对「计算资源」的消耗越大。 ::: ## 模型部署的更新 模型部署下可以包含多个版本,当创建或启动另一个模型部署版本后,运行中的模型部署版本将会被关闭,即同一个模型部署下只允许一个运行中的模型部署版本。 ![](/img/docs/managing-serving-3.png) ## 删除不需要的模型部署版本 可以删除非活跃的模型版本: ![](/img/docs/managing-serving-4.png) :::caution 注意 模型部署版本依然处于活跃状态(即不处于「已关闭」或者「执行出错」状态)则无法被删除。 ::: ## 删除整个模型部署 如果整个模型部署都不再需要,可以在该模型部署的「设置」页面删除整个模型部署。 ![](/img/docs/managing-serving-5.png) :::caution 注意 模型部署如果有活跃的模型版本(即不处于「已关闭」或者「执行出错」状态),则该模型部署无法被删除。 ::: --- ## API Key 管理 模型部署服务提供了完整的 API Key 管理功能,让你能够安全地访问和调用已部署的模型。本文将介绍如何创建、管理和使用 API Key。 ## 访问控制说明 默认情况下,新创建的模型部署是**公开访问**的,即任何人都可以调用该服务,无需认证。这种模式适用于: - 公开的演示服务 - 测试环境 - 不需要访问控制的场景 如果需要限制访问,你可以: 1. 进入模型部署的设置页面 2. 找到「访问控制」部分 3. 开启访问控制开关 开启访问控制后,所有的访问请求都需要提供有效的 API Key。 ## API Key 概述 API Key 是访问模型部署服务的凭证,它提供了以下优势: - **安全性**:每个 API Key 都是唯一的,可以独立管理和撤销 - **灵活控制**:支持用户级别和模型部署级别的访问控制 - **简单易用**:符合业界标准实践(如 OpenAI、HuggingFace 等) ## 访问入口 你可以通过以下三种方式访问 API Key 管理功能: 1. **模型部署级别** - 进入具体的模型部署页面 - 开启「访问控制」后 - 可以在设置中管理该模型部署的 API Key 2. **对于个人用户** - 点击左下角的「账号设置」 - 在右侧面板中找到「API Key」选项 - 管理你的个人 API Key 3. **对于组织用户** - 点击左下角的「组织设置」 - 在右侧面板中访问「API Key」 - 管理组织的 API Key ## API Key 类型 OpenBayes 提供两种类型的 API Key: 1. **用户级别 API Key** - 可以访问该用户下的所有模型部署 - 适合需要统一管理多个模型部署的场景 2. **模型部署级别 API Key** - 只能访问特定的模型部署 - 支持绑定一个或多个模型部署 - 可以根据需要更改绑定的模型部署 :::info 提示 API Key 的类型可以根据需要进行变更,你可以调整一个 Key 可以访问的模型部署范围。 ::: :::caution 注意 API Key 的创建、更新或删除操作可能需要大约 5 分钟才能生效。在此期间,请耐心等待并避免重复操作。 ::: ## 创建 API Key 1. 进入模型部署的设置页面 2. 找到「API Key 管理」部分 3. 点击「创建 API Key」按钮 4. 在弹出的对话框中: - 输入 API Key 的名称(用于识别用途) - 选择 API Key 类型(用户级别或模型部署级别) - 如果选择模型部署级别,选择要绑定的模型部署 - 点击「创建」按钮 ![创建 API Key](/img/docs/serving-api-key-create-api-key.png) :::caution 注意 新创建的 API Key 只会显示一次。请确保立即复制并安全保存,因为之后将无法再次查看完整的 Key。 ::: ## 编辑 API Key 权限 你可以随时调整模型部署级别 API Key 可以访问的模型: 1. 在 API Key 列表中找到要编辑的 Key 2. 点击「编辑」按钮 3. 在弹出的对话框中修改可访问的模型部署 4. 点击「确认」确认更改 ![编辑 API Key 权限](/img/docs/serving-api-key-edit-serving-key.png) ## 删除 API Key 如果不再需要某个 API Key,或者怀疑 Key 已经泄露,你可以: 1. 在 API Key 列表中找到要删除的 Key 2. 点击「删除」按钮 3. 确认删除操作 ![删除 API Key](/img/docs/serving-api-key-revoke-key.png) :::warning 警告 删除 API Key 是不可逆操作。删除后,使用该 Key 的所有应用都将无法访问模型部署服务。请注意删除操作可能需要大约 5 分钟才能完全生效。 ::: ## 使用 API Key 在调用模型部署服务时,需要在请求头中包含 API Key。以下是一个调用大语言模型服务的示例: ```bash curl --location 'https://open-tutorials-2obiahfo3kig.serv-c1.openbayes.net/v1/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer sk-5cyqtxxxxxdevjuiife5zpz8tsj' \ --data '{ "model": "DeepSeek-R1-Distill-Qwen-1.5B", "messages": [ { "role": "user", "content": "hi" } ] }' ``` ### HTTP 请求头说明 在发送请求时,需要在 HTTP 请求头中包含以下信息: **Authorization 头**: - 格式:`Bearer sk-xxxxxx`(注意 Bearer 和 key 之间有一个空格) - 示例:`Authorization: Bearer sk-5cyqtxxxxxdevjuiife5zpz8tsj` ### 状态码说明 服务器会返回以下状态码: - **200 - 300**: 请求成功 - **401**: 未授权(API Key 无效或未提供) - **403**: 禁止访问(API Key 有效但没有访问特定服务的权限) 示例响应: ```json { "id": "chatcmpl-5b543fe0122745a89fb1002342442ab1", "object": "chat.completion", "created": 1745213042, "model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [ { "index": 0, "message": { "role": "assistant", "reasoning_content": null, "content": "Hello! How can I assist you today?", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": null } ], "usage": { "prompt_tokens": 6, "total_tokens": 64, "completion_tokens": 58, "prompt_tokens_details": null }, "prompt_logprobs": null } ``` ## 安全建议 1. **妥善保管**: - 将 API Key 存储在安全的地方 - 不要在代码仓库中直接保存 API Key - 使用环境变量或配置管理系统存储 Key 2. **定期轮换**: - 定期创建新的 API Key 并更新应用 - 删除长期未使用的 Key - 发现安全问题时立即轮换 Key 3. **最小权限**: - 优先使用模型部署级别的 Key,除非确实需要访问多个模型 - 及时删除不需要的 Key - 定期审查 Key 的权限范围 --- ## 自定义镜像 :::info 只有私有部署才支持该功能。 ::: 在[依赖管理](/docs/serving/dependencies/)部分介绍的依赖安装会在「模型部署」启动时执行,为了加速服务的启动可以通过使用自定义镜像,在自定义镜像中预装所有的依赖。 ## 准备 Dockerfile 首先,自定义镜像的目的是为了加速模型部署的启动速度,避免不必要的依赖安装。因此,所有的自定义镜像都必须在 OpenBayes 提供的官方镜像基础上构建而来。 请前往「管理员」-「镜像」获取镜像地址。 以下是一个在 Python GPU 模式下准备依赖的例子: ```dockerfile FROM uhub.service.ucloud.cn/openbayesruntimes/pytorch:1.7.0-py36-cpu.55 RUN pip install --no-cache-dir opencv-python==4.2.0.34 ``` 可以看到,这个样例里为 Python GPU 模式下预装了依赖:`opencv-python`。 ## 构建并将镜像推送到镜像仓库 构建镜像并将镜像推送到镜像仓库,这里我们以 UCloud 的镜像仓库为例: ```bash docker login uhub.service.ucloud.cn Username: Password: # Login Succeeded docker build . -t uhub.service.ucloud.cn// docker push uhub.service.ucloud.cn// ``` ## 创建模型部署时使用自定义镜像 在创建模型部署时,将以上构建的镜像填入到`「自定义镜像」`位置,部署时将使用所指定的镜像而不是官方默认镜像。 ![](/img/docs/2020-09-08-15-12-24.png) --- ## Serving 服务编写(迁移说明) `predictor.py` 方式已下线,Serving 统一采用 `start.sh` 启动脚本流程。 ## 你需要做什么 如果你之前使用的是 `predictor.py`,请迁移到以下结构: ```text project/ ├── start.sh ├── requirements.txt # 可选 ├── conda-packages.txt # 可选 ├── dependencies.sh # 可选 └── ``` ## `start.sh` 的要求 - 启动你的 HTTP 服务 - 监听 `0.0.0.0:80`(必须绑定 `0.0.0.0`,不要绑 `127.0.0.1` 或 `localhost`,否则平台无法探测到你的服务) - 确保服务在前台运行(不要在脚本末尾直接退出) ## 推荐迁移步骤 1. 将原 `predictor.py` 中的模型加载与推理逻辑抽离到普通 Python 模块(如 `app.py`、`server.py`) 2. 用 FastAPI、Flask、Gradio 或其他框架暴露 HTTP 接口 3. 在 `start.sh` 中安装依赖并启动服务进程 4. 本地验证接口后再创建 ServingVersion ## 参考文档 - [快速上手](/docs/serving/getting-started) - [依赖管理](/docs/serving/dependencies) - [模型部署介绍](/docs/serving) --- ## 模型部署介绍 在完成了模型的训练后可以将模型以某种方式部署到服务端或者存放到设备端对外提供实时的模型推理服务。「模型部署(Serving)」就是 OpenBayes 提供的服务端模型推理功能。 ## 部署模式 OpenBayes 模型部署采用 `start.sh` 自定义启动脚本的方式,你可以完全控制服务启动流程。 ## 配额限制 模型部署同样受账号级 limitation 影响,包括: - 私有 / 公有模型部署个数限制; - 所使用资源的并行限制; - GPU 类型总量限制。 如果你在创建模型部署、切换公开状态或启动版本时遇到限制,请参考 [配额限制](/docs/limitations)。 ## API Key 认证 OpenBayes 模型部署支持使用 API Key 进行安全认证。相比 JWT Token 认证方式,API Key: - 提供更细粒度的访问控制 - 支持独立的密钥管理和追踪 - 符合业界标准实践(如 OpenAI、HuggingFace 等) 你可以在模型部署的设置页面中创建和管理 API Key。详细信息请参考 [API Key 管理](/docs/serving/api-key-management)。 ## 自定义部署方式(推荐) 这是最简单和灵活的部署方式。你只需要: 1. 准备好模型文件 2. 编写一个 `start.sh` 脚本来启动你的服务 ### 自定义部署要求 1. 必需文件: - `start.sh` - 启动脚本,需要确保: - 监听 `0.0.0.0:80`(必须绑定 `0.0.0.0`,不要绑 `127.0.0.1` 或 `localhost`,否则平台无法探测到你的服务) - 处理 HTTP 请求 - 模型文件及其他依赖文件 2. 可选文件: - `requirements.txt` - 用于安装 Python 依赖 - `conda-packages.txt` - 用于安装 Conda 依赖 - `dependencies.sh` - 用于安装系统依赖 - `.env` - 用于设置环境变量 ### 示例 你可以使用任何框架(如 FastAPI、Flask、Gradio 等)来提供服务。这里是一个使用 FastAPI 的简单示例: ```python # app.py from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") def predict(): return {"message": "Hello World"} ``` ```bash # start.sh #!/bin/bash pip install fastapi uvicorn uvicorn app:app --host 0.0.0.0 --port 80 ``` ## 数据绑定 在创建模型部署时,你可以绑定一个或多个数据目录。数据绑定的方式与[模型训练的数据绑定](/docs/gear/databinding)基本相同,可以选择以下来源: - 公开数据集或模型 - 个人私有的数据集或模型 - 算力容器的工作目录 - 通过文件上传的数据仓库 数据绑定格式与 Job 基本一致,常见写法如下: - 数据集版本:`//` - Job 输出:`/jobs//output` 手工编写 CLI、YAML 或 API 参数时,推荐优先使用数据集 ID 或 Job ID 作为 `ref`,避免名称中的空格、转义或歧义问题。更完整的格式说明见[数据绑定](/docs/gear/databinding)。 ### 数据绑定特点 模型部署的数据绑定与模型训练有以下区别: 1. **只读绑定**:所有数据绑定都是只读模式,无法进行写入或修改操作 2. **多目录绑定**:可以同时绑定多个数据目录到不同的挂载点: - `/openbayes/input/input0` - `/openbayes/input/input1` - `/openbayes/input/input2` - `/openbayes/input/input3` - `/openbayes/input/input4` 3. **工作目录特性**: - 工作目录(`/openbayes/home`)中的内容是在部署启动时从绑定源拷贝而来 - 重要提示:由于工作目录的内容在重启后会丢失,建议将所有必要的模型文件和依赖放在绑定的数据目录中 ### Serving 的额外限制 与 Job 相比,Serving 的数据绑定还有以下约束: 1. **仅支持两类绑定源**:只支持数据集版本和 Job 输出,不支持其他特殊绑定方式 2. **必须存在 `/output` 绑定**:创建 ServingVersion 时,至少需要有一个绑定挂载到 `/output` 3. **`/output` 必须包含启动文件**:挂载到 `/output` 的绑定源中必须存在 `start.sh` 4. **挂载路径不能重复**:同一个 ServingVersion 中,`/output`、`/input0` ~ `/input4` 不能重复使用 其中 `/output` 对应容器内的工作目录 `/openbayes/home`,通常用于放置部署启动所需的代码、模型文件和依赖描述文件。 ### 选择绑定目录 绑定时的选取方式与算力容器类似: ![serving 数据绑定](/img/docs/serving-databinding.png) ## 版本管理 模型部署支持版本管理: - 版本之间相互独立,可以支持不同的运行时环境、资源类型以及部署内容 - 当部署新版本时,老版本会自动下线 - 版本号以数字序号递增 详细的操作在 [模型部署的管理](/docs/serving/manage-servings/) 有介绍。 ## 启动脚本约定 `start.sh` 中通常包含以下步骤: 1. 准备运行环境(例如安装依赖、激活 Conda 环境) 2. 加载模型与配置 3. 启动 HTTP 服务并监听 `0.0.0.0:80` 更多细节请参考 [快速上手](/docs/serving/getting-started) 与 [依赖管理](/docs/serving/dependencies)。 ## 启动与就绪 部署启动后,平台不会立刻把流量打进来,而是**等待你的服务在容器内监听 `0.0.0.0:80`**,端口可连接后才将该版本标记为就绪并开始接收请求。 加载大模型(下载权重、载入显存)通常需要数分钟,这段时间 Pod 处于“未就绪”是**正常现象**,不代表部署失败。为了让你能看到进度,平台会在**部署日志**中输出启动阶段的提示: ```text ===== 等待服务监听 80 端口,监听成功后才会接收请求 ===== ===== 服务尚未监听 80 端口,已等待 N 分钟,请确认服务监听地址为 0.0.0.0:80 ===== ===== 已检测到 80 端口,服务就绪 ===== ``` - 看到“**服务就绪**”即表示端口已就绪、版本开始接收请求。 - 如果反复看到“**服务尚未监听 80 端口,已等待 N 分钟**”,按以下顺序排查: - **绑定地址**:检查 `start.sh` 传给框架的 host 参数,确认是 `0.0.0.0` 而非 `127.0.0.1` / `localhost`,否则平台探测不到; - **监听端口**:确认框架实际监听的是 `80` 端口; - **启动失败或仍在加载**:查看部署日志中框架自身(vLLM、FastAPI 等)的输出,确认是否有报错或仍在下载 / 载入模型。 - 启动有最长约 **1 小时**的超时上限;超过仍未监听 80 端口,启动会判定为失败。请确保耗时操作(依赖安装、模型下载)能在该时间内完成,必要时把模型预置到[绑定的数据集](#数据绑定)里以避免每次冷启动重新下载。 :::tip 部署日志只反映平台侧的端口探测状态。你的服务自身(如 vLLM、FastAPI)的加载与报错日志同样会输出到部署日志中,排查启动问题时以这些框架日志为准。 ::: --- ## First Order Motion Model(damedane、蚂蚁呀嘿)制作教程 由于 b 站的审核原因,不允许 UP 主上传和「AI 换脸」相关的教程视频。但是产出物的审核相对叫较松。视具体内容而定,因此在本站提供 damedane 在线制作的教程文字版备忘。通过该教程你可以: - **免费**生成 damedane、蚂蚁呀嘿、unravel 等 AI 换脸视频 - 全程在线制作,不需要下载软件,只需要提供素材 - 了解 JupyterLab 的最基本用法 ## 更新记录 - 新增「蚂蚁呀嘿」视频素材 - 修复输出音画不同步的问题 - 优化视频输出 首先访问下面的链接进行注册: [https://openbayes.com/console/signup](https://openbayes.com/console/signup) 注册后,会自动登录,然后进入控制台首页,点击左侧边栏的公共教程 ![](/img/blog/vyhppobm.png) 然后在右侧列表中选择 damedane: ![](/img/blog/pmpao7m9.png) 进入教程页面之后,页面右上角有一个克隆按钮,点击克隆后,将该教程克隆到自己的账户下: ![](/img/blog/mz1w2uj.png) 然后容器名称随便取,算力选择 vGPU 或者 CPU 都可以,vGPU 速度会快一些,但额度优先 CPU 有更多的赠送额度,但速度相对较慢。下面的参数都不需要改,镜像就用默认的 PyTorch 就可以了,然后直接点审核并执行: ![](/img/blog/jjhlwkus.png) 然后稍等片刻,等运行状态变为运行中时,就可以点击页面下方的打开 Jupyter 编辑器: ![](/img/blog/cpq3cl11.png) 在 Jupyter 编辑器中,左侧双击 damedane.ipynb。打开相应文件: ![](/img/blog/u9je1kfn.png) 在左侧的文件列表中,可以看到有 `import.mp4` 和 `import.png` 两个文件,其中 `import.mp4` 为 damedane 的原视频文件,`unravel.mp4` 则为 Unravel 的源文件 这个教程默认运行的是 unravel 的。也就是说你如果什么都不操作直接执行的话,创建出来的换脸视频就是 unravel 的痛视频。如果我们需要制作 damedane 的换脸视频,我们需要做的是: - 修改代码中输入图片的 `source_image_name` 变量 - 修改代码中输入视频的 `source_video_name` 变量 - 执行任务 接下来我们就用制作 damedane 来举例子,首先准备好自己要使用的图片,注意图片不要太大,最好为 256x256 像素,然后直接通过拖拽上传到左侧的文件列表中。或者点击上方的「Upload Files」也可以上传。 然后在右侧代码块中,滚动到下方标有 `[20]`: 的代码块。将 `import.png` 替换为刚刚上传的图片的文件名: ![](/img/blog/9nnxwiq.png) 然后点击上方菜单栏的「Run - Run All Cells」执行所有代码块。然后稍等 3-5 分钟 提示:正在执行和等待执行的代码块,左侧会显示为 `[*]:` 符号。并且执行完成的代码块在下方会有相应的执行时间提示: ![](/img/blog/suys1faw.png) 执行完成后,就可以看到预览,然后按照最后代码块中的提示进行操作即可: ![](/img/blog/wm7r6dj9.png) --- ## 教程:在 OpenBayes 上使用 SGLang 部署 DeepSeek V3 ## 环境准备 使用「工作空间集群」启动包含两个节点的 batch workspace: 1. 每个 job 都使用 8 x H800 的算力。 2. 镜像使用 sglang 0.4.1 3. 数据集绑定 DeepSeek V3 模型 启动成功后,进入 master 容器。 ## 启动服务 准备以下两个命令,存放在 jupyter 默认开启的 /home 目录下: ### `run.sh` ```sh export NCCL_IB_DISABLE=0 export NCCL_IB_HCA=mlx5_4:1,mlx5_5:1,mlx5_6:1,mlx5_7:1 export NCCL_IB_GID_INDEX=5 export NCCL_SOCKET_IFNAME="eth0" export NCCL_DEBUG=info python -m sglang.launch_server \ --model-path /input0/DeepSeek-V3 --served-model-name deepseek-v3 --tp 16 \ --nccl-init $MASTER_IP:5000 --nnodes $NNODES --node-rank $NODE_RANK \ --trust-remote-code \ --host 0.0.0.0 --port 8080 ``` ### `master_run.py` ```python import json import subprocess # Step 1: Read hostfile.json with open('/hostfile.json') as f: hosts = json.load(f) MASTER_IP = hosts[0]['ip'] NNODES = len(hosts) # Step 2: Set environment variables on master node and execute run.sh subprocess.run([ 'tmux', 'new-session', '-d', '-s', 'node_0', '-n', 'run_tab', f'bash -c "export MASTER_IP={MASTER_IP} && export NNODES={NNODES} && export NODE_RANK=0 && bash /openbayes/home/run.sh; exec bash"' ]) print(f"Master IP: {MASTER_IP}, NNODES: {NNODES}, NODE_RANK: 0") # Step 3: Iterate over worker nodes and configure them for rank, node in enumerate(hosts[1:], start=1): node_ip = node['ip'] print(f"Configuring node {rank} at {node_ip}") # Copy run.sh to the remote node subprocess.run([ 'scp', 'run.sh', f'root@{node_ip}:/openbayes/home/run.sh' ]) # Set environment variables on remote node and start the script in a tmux session with a new window subprocess.run([ 'ssh', f'root@{node_ip}', f'tmux new-session -d -s node_{rank} \; new-window -n run_tab bash -c "export MASTER_IP={MASTER_IP} && export NNODES={NNODES} && export NODE_RANK={rank} && bash /openbayes/home/run.sh; exec bash"' ]) print("All nodes have been configured and started in tmux sessions with a dedicated window for run.sh.") ``` 执行命令 `python master_run.py`,即可启动服务。通过命令 `tmux a` 可以查看服务的启动流程和服务的运行状态。 **注意** 由于 DeepSeek V3 模型较大,启动服务需要较长时间,通常需要 30 - 40 分钟的启动时间,请耐心等待。 当看到如下信息时说明服务启动成功了: ```txt [2025-01-07 09:38:20] INFO: Started server process [9209] [2025-01-07 09:38:20] INFO: Waiting for application startup. [2025-01-07 09:38:20] INFO: Application startup complete. [2025-01-07 09:38:20] INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) [2025-01-07 09:38:21] INFO: 127.0.0.1:46856 - "GET /get_model_info HTTP/1.1" 200 OK ``` ## 效果测试 服务的 api 地址在开启 jupyter 服务后右侧边栏的「API地址」中可以看到,这里所使用的 `sglang` 提供一个 OpenAI 兼容的 API 接口,可以参考 OpenAI 的 API 文档进行调用。 --- ## 教程:基于 UIE 的命名实体识别 本教程基于 PaddleNLP 的 [Universal Information Extraction](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie) 进行命名实体识别任务,并展示通过**标注少量数据**进行微调获取模型效果快速提升。 :::note 完整的 Jupyter 笔记本、代码、标注数据在 https://openbayes.com/console/open-tutorials/containers/lWyxi1DwhJU 都可以找得到。 ::: ## 导入依赖库 ```python from pprint import pprint from paddlenlp import Taskflow ``` ## 使用 uie-base 进行命名实体识别 首先直接使用预训练模型 uie-base 进行命名实体识别,不做任何的调优看看效果。 ```python schema = [ '地名', '人名', '组织', '时间', '产品', '价格', '天气' ] ie = Taskflow('information_extraction', schema=schema) pprint(ie("2K 与 Gearbox Software 宣布,《小缇娜的奇幻之地》将于 6 月 24 日凌晨 1 点登录 Steam,此前 PC 平台为 Epic 限时独占。在限定期间内,Steam 玩家可以在 Steam 入手《小缇娜的奇幻之地》,并在 2022 年 7 月 8 日前享有获得黄金英雄铠甲包。")) ``` ```json [{'产品': [{'end': 35, 'probability': 0.8594067882980987, 'start': 25, 'text': '《小缇娜的奇幻之地》'}], '地名': [{'end': 117, 'probability': 0.5248250992968906, 'start': 109, 'text': '小缇娜的奇幻之地'}, {'end': 34, 'probability': 0.3007929716932729, 'start': 26, 'text': '小缇娜的奇幻之地'}], '时间': [{'end': 52, 'probability': 0.87968346213556, 'start': 38, 'text': '6 月 24 日凌晨 1 点'}], '组织': [{'end': 93, 'probability': 0.5977969768231866, 'start': 88, 'text': 'Steam'}, {'end': 2, 'probability': 0.6914769673274321, 'start': 0, 'text': '2K'}, {'end': 75, 'probability': 0.5848915911412256, 'start': 71, 'text': 'Epic'}, {'end': 60, 'probability': 0.5682100157587833, 'start': 55, 'text': 'Steam'}, {'end': 21, 'probability': 0.679590305138845, 'start': 5, 'text': 'Gearbox Software'}, {'end': 105, 'probability': 0.4573145431744834, 'start': 100, 'text': 'Steam'}]}] ``` ```python pprint(ie("近日,量子计算专家、ACM 计算奖得主 Scott Aaronson 通过博客宣布,将于本周离开得克萨斯大学奥斯汀分校 (UT Austin) 一年,并加盟人工智能研究公司 OpenAI。")) ``` ```json [{'人名': [{'end': 32, 'probability': 0.4801083732026494, 'start': 24, 'text': 'Aaronson'}, {'end': 23, 'probability': 0.6648137293130958, 'start': 18, 'text': 'Scott'}], '时间': [{'end': 43, 'probability': 0.8425767345737043, 'start': 41, 'text': '本周'}], '组织': [{'end': 87, 'probability': 0.5554367836811132, 'start': 81, 'text': 'OpenAI'}]}] ``` 使用默认模型 uie-base 进行命名实体识别,效果还不错,大多数的命名实体被识别出来了,但依然存在部分实体未被识别出,部分文本被误识别等问题。比如 "Scott Aaronson" 被识别为了两个人名,比如 "得克萨斯大学奥斯汀分校" 没有被识别出来。 为提升识别效果,本教程尝试通过标注少量数据对模型进行微调。 ## 数据标注 本教程使用数据标注平台 [Label Studio](https://labelstud.io/) 进行数据标注。所有的工作都是在一个开启了的 [「OpenBayes 工作空间」](https://openbayes.com/docs/gear/workspace) 中完成的。 ### 启动 Label Studio ![](/img/docs/openbayes-label-studio.gif) 如上所示,在 Jupyter 中打开终端并在终端中执行 `openbayes-label-studio` 即可在 OpenBayes Jupyter Workspace 中使用 LabelStudio 了。然后使用如下所示的命令行中生成的 url 启动 [Label Studio](https://labelstud.io/): ![start](/img/docs/label-studio-show/start.png) 在浏览器中打开链接,注册账户并登录,即可开始使用。 :::warning 对于不同的 OpenBayes 算力容器,红框中的外部访问链接各不相同,直接使用本教程中的链接是无效的,需用终端中提示的链接进行替换。 ::: ### 标注数据 ![](/img/docs/create-ner-project-in-labelstudio.gif) 具体步骤如下: 1. 创建项目。 2. 导入数据。本教程使用的数据已上传到此算力容器,即 `corpus.txt`。 3. 配置标签界面。在 Natural Language Processing 中选择 Named Entity Recognition 模板,根据需要添加或修改标签。本教程中需要定义的实体标签有『地名』『人名』『组织』『时间』『产品』『价格』『天气』。 ![labeling-setup](/img/docs/label-studio-show/labeling-setup.png) ![add-labels](/img/docs/label-studio-show/add-labels.png) 4. 开始标注数据。 5. 导出数据。标注完成后,从 label studio 导出 JSON 格式的结果文件。此算力容器中已有预先标注好的文件 `label-studio.json`。 ![](/img/docs/labelstudio-ner-label-example.gif) :::info 如果你懒得自己标注也没关系,这个教程里的 `label-studio.json` 就是已经标注好并导出的结果了。 ::: ## 模型微调 以下模型微调所需脚本已上传到[此算力容器](https://openbayes.com/console/open-tutorials/containers/lWyxi1DwhJU)。 ### 数据转换 在终端中执行以下脚本,将 label studio 导出的数据文件格式转换成 doccano 导出的数据文件格式。 ```shell python labelstudio2doccano.py --labelstudio_file label-studio.json ``` 参数说明: - `labelstudio_file`: label studio 的导出文件路径(仅支持 JSON 格式)。 - `doccano_file`: doccano 格式的数据文件保存路径,默认为 "doccano_ext.jsonl"。 - `task_type`: 任务类型,可选有抽取("ext")和分类("cls")两种类型的任务,默认为 "ext"。 :::info PaddleNLP 默认并不提供将 labelstudio 的标注格式转换为其所支持的格式的工具,我们这里提供了一个 `labelstudio2doccano.py` 的脚本。 ::: 然后在终端中执行以下脚本,对 doccano 格式的数据文件进行处理,执行后会在 /home/data 目录下生成训练/验证/测试集文件。 ```shell python doccano.py \ --doccano_file ./doccano_ext.jsonl \ --task_type "ext" \ --save_dir ./data \ --splits 0.7 0.2 0.1 ``` 参数说明: - `doccano_file`: doccano 格式的数据标注文件路径。 - `task_type`: 选择任务类型,可选有抽取("ext")和分类("cls")两种类型的任务。 - `save_dir`: 训练数据的保存目录,默认存储在 data 目录下。 - `negative_ratio`: 最大负例比例,该参数只对抽取类型任务有效,适当构造负例可提升模型效果。负例数量和实际的标签数量有关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集有效,默认为 5。为了保证评估指标的准确性,验证集和测试集默认构造全负例。 - `splits`: 划分数据集时训练集、验证集、测试集所占的比例。默认为 [0.8, 0.1, 0.1] 。 - `options`: 指定分类任务的类别标签,该参数只对分类类型任务有效。默认为 ["正向", "负向"]。 - `prompt_prefix`: 声明分类任务的 prompt 前缀信息,该参数只对分类类型任务有效。默认为 "情感倾向"。 - `is_shuffle`: 是否对数据集进行随机打散,默认为 True。 - `seed`: 随机种子,默认为 1000。 - `separator`: 实体类别/评价维度与分类标签的分隔符,该参数只对实体/评价维度级分类任务有效。默认为 "##"。 :::warning 每次执行 doccano.py 脚本,将会覆盖已有的同名数据文件。 ::: ### Finetune 在终端中执行以下脚本进行模型微调。 ```shell python finetune.py \ --train_path "./data/train.txt" \ --dev_path "./data/dev.txt" \ --save_dir "./checkpoint" \ --learning_rate 1e-5 \ --batch_size 4 \ --max_seq_len 512 \ --num_epochs 50 \ --model "uie-base" \ --seed 1000 \ --logging_steps 10 \ --valid_steps 100 \ --device "gpu" ``` 参数说明: - `train_path`: 训练集文件路径。 - `dev_path`: 验证集文件路径。 - `save_dir`: 模型存储路径,默认为 "./checkpoint"。 - `learning_rate`: 学习率,默认为 1e-5。 - `batch_size`: 批处理大小,请结合机器情况进行调整,默认为 16。 - `max_seq_len`: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为 512。 - `num_epochs`: 训练轮数,默认为 100。 - `model`: 选择模型,程序会基于选择的模型进行模型微调,可选有 "uie-base", "uie-medium", "uie-mini", "uie-micro" 和 "uie-nano",默认为 "uie-base"。 - `seed`: 随机种子,默认为 1000。 - `logging_steps`: 日志打印的间隔 steps 数,默认为 10。 - `valid_steps`: evaluate 的间隔 steps 数,默认为 100。 - `device`: 选用什么设备进行训练,可选 "cpu" 或 "gpu"。 - `init_from_ckpt`: 初始化模型参数的路径,可从断点处继续训练。 ### 模型评估 在终端中执行以下脚本进行模型评估。 ```shell python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path ./data/dev.txt \ --batch_size 16 \ --max_seq_len 512 ``` 输出: ``` [2022-07-15 03:18:19,157] [ INFO] - ----------------------------- [2022-07-15 03:18:19,157] [ INFO] - Class Name: all_classes [2022-07-15 03:18:19,157] [ INFO] - Evaluation Precision: 0.95349 | Recall: 0.89130 | F1: 0.92135 ``` 可以看到 F1 已经达到了 `0.92`,说明模型的效果较好。 参数说明: - `model_path`: 进行评估的模型文件夹路径,路径下需包含模型权重文件 model_state.pdparams 及配置文件 model_config.json。 - `test_path`: 进行评估的测试集文件。 - `batch_size`: 批处理大小,请结合机器情况进行调整,默认为 16。 - `max_seq_len`: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为 512。 - `debug`: 是否开启 debug 模式对每个正例类别分别进行评估,该模式仅用于模型调试,默认关闭。 `debug` 模式输出示例: ``` [2022-07-15 03:27:57,801] [ INFO] - ----------------------------- [2022-07-15 03:27:57,801] [ INFO] - Class Name: 组织 [2022-07-15 03:27:57,802] [ INFO] - Evaluation Precision: 1.00000 | Recall: 0.75000 | F1: 0.85714 [2022-07-15 03:27:57,913] [ INFO] - ----------------------------- [2022-07-15 03:27:57,913] [ INFO] - Class Name: 地名 [2022-07-15 03:27:57,913] [ INFO] - Evaluation Precision: 0.90476 | Recall: 0.82609 | F1: 0.86364 [2022-07-15 03:27:58,046] [ INFO] - ----------------------------- [2022-07-15 03:27:58,046] [ INFO] - Class Name: 时间 [2022-07-15 03:27:58,047] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-15 03:27:58,098] [ INFO] - ----------------------------- [2022-07-15 03:27:58,098] [ INFO] - Class Name: 产品 [2022-07-15 03:27:58,098] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-15 03:27:58,147] [ INFO] - ----------------------------- [2022-07-15 03:27:58,147] [ INFO] - Class Name: 价格 [2022-07-15 03:27:58,147] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-15 03:27:58,176] [ INFO] - ----------------------------- [2022-07-15 03:27:58,176] [ INFO] - Class Name: 人名 [2022-07-15 03:27:58,177] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 ``` ## 微调后效果 ```python my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best') # task_path 指定模型权重文件的路径 pprint(my_ie("2K 与 Gearbox Software 宣布,《小缇娜的奇幻之地》将于 6 月 24 日凌晨 1 点登录 Steam,此前 PC 平台为 Epic 限时独占。在限定期间内,Steam 玩家可以在 Steam 入手《小缇娜的奇幻之地》,并在 2022 年 7 月 8 日前享有获得黄金英雄铠甲包。")) ``` ```json [{'产品': [{'end': 148, 'probability': 0.9977381891196586, 'start': 141, 'text': '黄金英雄铠甲包'}], '时间': [{'end': 52, 'probability': 0.9999856949362851, 'start': 38, 'text': '6 月 24 日凌晨 1 点'}, {'end': 137, 'probability': 0.6508416072546055, 'start': 122, 'text': '2022 年 7 月 8 日前'}], '组织': [{'end': 21, 'probability': 0.9996073012678011, 'start': 5, 'text': 'Gearbox Software'}, {'end': 93, 'probability': 0.9872895891306825, 'start': 88, 'text': 'Steam'}, {'end': 105, 'probability': 0.9665188911951077, 'start': 100, 'text': 'Steam'}, {'end': 2, 'probability': 0.9883892925330713, 'start': 0, 'text': '2K'}, {'end': 75, 'probability': 0.9965524822425209, 'start': 71, 'text': 'Epic'}, {'end': 60, 'probability': 0.9965759490955008, 'start': 55, 'text': 'Steam'}]}] ``` ```python pprint(my_ie("近日,量子计算专家、ACM 计算奖得主 Scott Aaronson 通过博客宣布,将于本周离开得克萨斯大学奥斯汀分校 (UT Austin) 一年,并加盟人工智能研究公司 OpenAI。")) ``` ```json [{'人名': [{'end': 32, 'probability': 0.9999316942434575, 'start': 18, 'text': 'Scott Aaronson'}], '地名': [{'end': 54, 'probability': 0.976469583224933, 'start': 51, 'text': '奥斯汀'}], '时间': [{'end': 69, 'probability': 0.9782005099896942, 'start': 67, 'text': '一年'}, {'end': 2, 'probability': 0.9995077236474508, 'start': 0, 'text': '近日'}, {'end': 43, 'probability': 0.9999382505043286, 'start': 41, 'text': '本周'}], '组织': [{'end': 66, 'probability': 0.46570937436359827, 'start': 57, 'text': 'UT Austin'}, {'end': 56, 'probability': 0.9686587700987381, 'start': 45, 'text': '得克萨斯大学奥斯汀分校'}, {'end': 13, 'probability': 0.7166219551892539, 'start': 10, 'text': 'ACM'}, {'end': 87, 'probability': 0.999835617128781, 'start': 81, 'text': 'OpenAI'}]}] ``` ## 模型部署 得到微调后的模型后,可以将模型部署到 OpenBayes 的服务端,以实现实时的模型推理服务。 更多有关模型部署的信息可参考 [模型部署介绍](https://openbayes.com/docs/serving/) 和 [基于迁移学习的中文命名实体识别的模型部署](https://openbayes.com/console/open-tutorials/containers/mL0owZlZd0g)。 ### Serving 服务编写 编写 `predictor.py` 文件: - 导入依赖库:除了业务中用到的库之外,需要额外依赖 openbayes-serving。 ```python import openbayes_serving as serv from paddlenlp import Taskflow ``` - 后处理(可选):根据需要对模型返回的结果进行处理,以更好地展示。本教程中通过 `format()` 函数和 `add_o()` 函数修改命名实体识别结果的形式。 - **Predictor 类:** 不需要继承其他的类,但是至少需要提供 `__init__` 和 `predict` 两个接口。 - 在 `__init__` 中定义实体抽取结构,通过 `Taskflow` 加载模型。 - 在 `predict` 中进行预测,返回后处理的结果。 ```python class Predictor: def __init__(self): self.schema = ['地名', '人名', '组织', '时间', '产品', '价格', '天气'] self.ie = Taskflow("information_extraction", schema=self.schema, task_path='./checkpoint/model_best') def predict(self, json): text = json["input"] uie = self.ie(text)[0] result = format(text, uie) return result ``` - 运行:启动服务。 ```python if __name__ == '__main__': serv.run(Predictor) ``` :::info 在教程的根目录下已经提供了编写好的 `predictor.py` 可以直接在后续使用。 ::: ### 在 Jupyter 中测试 在终端中执行 `OPENBAYES_JOB_URL= python predictor.py` ,成功开启本地测试服务后,在此 Notebook 中执行下列代码进行测试。 ```python import requests text = { "input": "近日,量子计算专家、ACM 计算奖得主 Scott Aaronson 通过博客宣布,将于本周离开得克萨斯大学奥斯汀分校 (UT Austin) 一年,并加盟人工智能研究公司 OpenAI。" } result = requests.post('http://localhost:25252', json=text) result.json() ``` ```json [{'entity_group': 'TIME', 'score': 0.9995077236474508, 'start': 0, 'end': 2, 'word': '近日'}, {'entity_group': 'O', 'score': None, 'start': 2, 'end': 10, 'word': ',量子计算专家、'}, {'entity_group': 'ORG', 'score': 0.7166219551892539, 'start': 10, 'end': 13, 'word': 'ACM'}, {'entity_group': 'O', 'score': None, 'start': 13, 'end': 18, 'word': '计算奖得主'}, {'entity_group': 'PER', 'score': 0.9999316942434575, 'start': 18, 'end': 32, 'word': 'Scott Aaronson'}, {'entity_group': 'O', 'score': None, 'start': 32, 'end': 41, 'word': '通过博客宣布,将于'}, {'entity_group': 'TIME', 'score': 0.9999382505043286, 'start': 41, 'end': 43, 'word': '本周'}, {'entity_group': 'O', 'score': None, 'start': 43, 'end': 45, 'word': '离开'}, {'entity_group': 'ORG', 'score': 0.9686587700987381, 'start': 45, 'end': 56, 'word': '得克萨斯大学奥斯汀分校'}, {'entity_group': 'LOC', 'score': 0.976469583224933, 'start': 51, 'end': 54, 'word': '奥斯汀'}, {'entity_group': 'O', 'score': None, 'start': 56, 'end': 57, 'word': '('}, {'entity_group': 'ORG', 'score': 0.46570937436359827, 'start': 57, 'end': 66, 'word': 'UT Austin'}, {'entity_group': 'O', 'score': None, 'start': 66, 'end': 67, 'word': ')'}, {'entity_group': 'TIME', 'score': 0.9782005099896942, 'start': 67, 'end': 69, 'word': '一年'}, {'entity_group': 'O', 'score': None, 'start': 69, 'end': 81, 'word': ',并加盟人工智能研究公司'}, {'entity_group': 'ORG', 'score': 0.999835617128781, 'start': 81, 'end': 87, 'word': 'OpenAI'}, {'entity_group': 'O', 'score': None, 'start': 87, 'end': 88, 'word': '。'}] ``` ## 部署 测试成功后,停止此算力容器,等待同步数据完成。 在『算力容器』-『模型部署』中点击『创建新部署』,选择与开发时相同的镜像,绑定此算力容器,点击『部署』,即可进行在线测试。 ![](/img/docs/create-serving-for-uie.gif) ### 测试部署 ![](/img/docs/model-serving-test-for-ner.gif) --- ## 教程:如何优化 Git 下载速度 由于 [众所周知的原因](https://en.wikipedia.org/wiki/Great_Firewall),我们访问 GitHub 的速度非常不稳定,时快时慢,甚至有时候会无法连接,这导致有时候在 OpenBayes 平台上无法正常克隆 git 项目,或者说会导致速度非常的慢。目前我们在积极的研究可行的解决方案。在最终方案出来之前,可以通过下面的方法临时解决: 第一步,先去 [Gitee](https://gitee.com/) 注册一个免费账号 然后找到需要克隆的 GitHub 项目,例如: ![](/img/blog/s8ud2uow.png) avinashpaliwal/Super-SloMo 超级慢镜头项目 然后,找到对应的项目链接 `https://github.com/avinashpaliwal/Super-SloMo` 将其复制到剪切板。切换到 Gitee,在右上角点击「+」号,选择「从 GitHub / GitLab 导入仓库」: ![](/img/blog/6ksw6b.png) Gitee:从 GitHub / GitLab 导入仓库 在导入界面中,将 GitHub 的链接贴入「Git 仓库 URL」中: ![](/img/blog/d2rsp7l1.png) Gitee 的导入界面 这时候有可能会出现上面的提示,例如: > 检测到目前导入仓库在 Gitee 上已有公开同步仓库,点击链接马上访问:[https://gitee.com/openbayes/Super-SloMo](https://gitee.com/openbayes/Super-SloMo) 如果看到这样的提示,说明之前已经有人导入过了,这时可以直接使用之前用户导入的链接,替换掉 GitHub 的链接进行克隆。如果你担心别的用户导入的内容会在未来被删掉,你也可以手动选择导入到自己的账户下。当然如果你像上图一样看到的是 openbayes 导入的资源,请放心使用,我们不会主动删除导入的资源 如果选择导入到自己的账户,那需要在下方的是否开源选项中勾选「公开」,然后点击导入: ![](/img/blog/q6vfa_ll.png) 勾选公开选项 导入完成后,就可以直接使用 Gitee 的链接替换掉 GitHub 原先的链接进行克隆,进行加速 --- ## 教程: 使用 PaddleOCR 实现集装箱箱号检测识别 ![](/img/blog/cargo-container-ocr-result.jpg) 完整的教程在 https://openbayes.com/console/open-tutorials/containers/XJsxhLTnKNu 可以直接「克隆」使用。 ## 项目介绍 集装箱号是指装运出口货物集装箱的箱号,填写托运单时必填此项。标准箱号构成基本概念:采用 ISO6346(1995)标准 标准集装箱箱号由 11 位编码组成,如:**CBHU 123456 7**,包括三个部分: 1. 第一部分由 4 位英文字母组成。前三位代码主要说明箱主、经营人,第四位代码说明集装箱的类型。列如 CBHU 开头的标准集装箱是表明箱主和经营人为中远集运 2. 第二部分由 6 位数字组成。是箱体注册码,用于一个集装箱箱体持有的唯一标识 3. 第三部分为校验码由前 4 位字母和 6 位数字经过校验规则运算得到,用于识别在校验时是否发生错误。即第 11 位编号 本教程基于[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)进行集装箱箱号检测识别任务,使用少量数据分别训练检测、识别模型,最后将他们串联在一起实现集装箱箱号检测识别的任务 ## 环境准备 1、在 openbayes 启动一个「模型训练」的容器,**环境选择** paddlepaddle-2.3,**资源选择** vGPU 或其他 GPU 容器 2、在 Jupyter 中打开一个 Terminal 窗口,然后执行如下命令: ```python cd PaddleOCR-release-2.5 #进入 PaddleOCR-release-2.5 文件夹 pip install -r requirements.txt #安装 PaddleOCR 所需依赖 python setup.py install #安装 PaddleOCR ``` ## 数据集介绍 本教程所使用的[集装箱箱号数据集](https://github.com/lbf4616/ContainerNumber-OCR),该数据包含 3003 张分辨率为 `1920×1080` 的集装箱图像 1、PaddleOCR 检测模型训练标注规则如下,中间用"\t"分隔: ``` " 图像文件名 json.dumps 编码的图像标注信息" ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}] ``` 其中 json.dumps 编码前的图像标注信息是包含多个字典的 list,字典中的 points 表示文本框的四个点的坐标 (x, y),从左上角的点开始顺时针排列。 transcription 表示当前文本框的文字,当其内容为“###”时,表示该文本框无效,在训练时会跳过。 2、PaddleOCR 识别模型训练标注规则如下,中间用"\t"分隔: ``` " 图像文件名 图像标注信息 " train_data/rec/train/word_001.jpg 简单可依赖 train_data/rec/train/word_002.jpg 用科技让复杂的世界更简单 ``` ## 数据整理 ### 检测模型所需数据准备 将数据集 3000 张图片按 2:1 划分成训练集和验证集,运行以下代码 ```python from tqdm import tqdm finename = "all_label.txt" f = open(finename) lines = f.readlines() t = open('det_train_label.txt','w') v = open('det_eval_label.txt','w') count = 0 for line in tqdm(lines): if count < 2000: t.writelines(line) count += 1 else: v.writelines(line) f.close() t.close() v.close() ``` ``` 100%|██████████| 3003/3003 [00:00<00:00, 37908.32it/s] ``` ### 识别模型所需数据准备 我们根据检测部分的注释,裁剪数据集尽可能只包含文字部分图片作为识别的数据,运行以下代码 ```python from PIL import Image import json from tqdm import tqdm import os import numpy as np import cv2 import math from PIL import Image, ImageDraw class Rotate(object): def __init__(self, image: Image.Image, coordinate): self.image = image.convert('RGB') self.coordinate = coordinate self.xy = [tuple(self.coordinate[k]) for k in ['left_top', 'right_top', 'right_bottom', 'left_bottom']] self._mask = None self.image.putalpha(self.mask) @property def mask(self): if not self._mask: mask = Image.new('L', self.image.size, 0) draw = ImageDraw.Draw(mask, 'L') draw.polygon(self.xy, fill=255) self._mask = mask return self._mask def run(self): image = self.rotation_angle() box = image.getbbox() return image.crop(box) def rotation_angle(self): x1, y1 = self.xy[0] x2, y2 = self.xy[1] angle = self.angle([x1, y1, x2, y2], [0, 0, 10, 0]) * -1 return self.image.rotate(angle, expand=True) def angle(self, v1, v2): dx1 = v1[2] - v1[0] dy1 = v1[3] - v1[1] dx2 = v2[2] - v2[0] dy2 = v2[3] - v2[1] angle1 = math.atan2(dy1, dx1) angle1 = int(angle1 * 180 / math.pi) angle2 = math.atan2(dy2, dx2) angle2 = int(angle2 * 180 / math.pi) if angle1 * angle2 >= 0: included_angle = abs(angle1 - angle2) else: included_angle = abs(angle1) + abs(angle2) if included_angle > 180: included_angle = 360 - included_angle return included_angle def image_cut_save(path, bbox, save_path): """ :param path: 图片路径 :param left: 区块左上角位置的像素点离图片左边界的距离 :param upper:区块左上角位置的像素点离图片上边界的距离 :param right:区块右下角位置的像素点离图片左边界的距离 :param lower:区块右下角位置的像素点离图片上边界的距离 """ img_width = 1920 img_height = 1080 img = Image.open(path) coordinate = {'left_top': bbox[0], 'right_top': bbox[1], 'right_bottom': bbox[2], 'left_bottom': bbox[3]} rotate = Rotate(img, coordinate) left, upper = bbox[0] right, lower = bbox[2] if lower-upper > right-left: rotate.run().convert('RGB').transpose(Image.ROTATE_90).save(save_path) else: rotate.run().convert('RGB').save(save_path) return True #读取检测标注制作识别数据集 files = ["det_train_label.txt","det_eval_label.txt"] filetypes =["train","eval"] for index,filename in enumerate(files): f = open(filename) l = open('rec_'+filetypes[index]+'_label.txt','w') if index == 0: data_dir = "RecTrainData" else: data_dir = "RecEvalData" if not os.path.exists(data_dir): os.mkdir(data_dir) lines = f.readlines() for line in tqdm(lines): image_name = line.split("\t")[0].split("/")[-1] annos = json.loads(line.split("\t")[-1]) img_path = os.path.join("/input0/images",image_name) for i,anno in enumerate(annos): data_path = os.path.join(data_dir,str(i)+"_"+image_name) if image_cut_save(img_path,anno["points"],data_path): l.writelines(str(i)+"_"+image_name+"\t"+anno["transcription"]+"\n") l.close() f.close() ``` ``` 100%|██████████| 2000/2000 [02:55<00:00, 11.39it/s] 100%|██████████| 1003/1003 [01:30<00:00, 11.05it/s] ``` ## 实验 由于数据集比较少,为了模型更好和更快的收敛,这里选用 PaddleOCR 中的 PP-OCRv3 模型进行检测和识别。PP-OCRv3 在 PP-OCRv2 的基础上,中文场景端到端 Hmean 指标相比于 PP-OCRv2 提升 5%, 英文数字模型端到端效果提升 11%。详细优化细节请参考 PP-OCRv3 技术报告。 ## 检测模型 ### 检测模型配置 PaddleOCR 提供了许多检测模型,在路径 `PaddleOCR-release-2.5/configs/det` 下可找到模型及其配置文件。如我们选用模型 `ch_PP-OCRv3_det_student.yml`,其配置文件路径在:`PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml`。使用前需对其进行必要的设置,如训练参数、数据集路径等。将部分关键配置展示如下: ```python #关键训练参数 use_gpu: true #是否使用显卡 epoch_num: 1200 #训练 epoch 个数 save_model_dir: ./output/ch_PP-OCR_V3_det/ #模型保存路径 save_epoch_step: 200 #每训练 200epoch,保存一次模型 eval_batch_step: [0, 100] #训练每迭代 100 次,进行一次验证 pretrained_model: ./PaddleOCR-release 2.5/pretrain_models/ch_PP-OCR_V3_det/best_accuracy.pdparams #预训练模型路径 #训练集路径设置 Train: dataset: name: SimpleDataSet data_dir: /input0/images #图片文件夹路径 label_file_list: - ./det_train_label.txt #标签路径 ``` ### 模型微调 在 notebook 中运行如下命令对模型进行微调,其中 -c 传入的为配置好的模型文件路径 ```python %run PaddleOCR-release-2.5/tools/train.py \ -c PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml ``` 使用默认超参数,模型 `ch_PP-OCRv3_det_student` 在训练集上训练 385 个 epoch 后,模型在验证集上的 hmean 达到:96.96%,此后再无明显增长 ```python [2022/10/11 06:36:09] ppocr INFO: best metric, hmean: 0.969551282051282, precision: 0.9577836411609498, recall: 0.981611681990265, fps: 20.347745459258228, best_epoch: 385 ``` ## 识别模型 ### 识别模型配置 PaddleOCR 也提供了许多识别模型,在路径 `PaddleOCR-release-2.5/configs/rec` 下可找到模型及其配置文件。如我们选用模型 ch_PP-OCRv3_rec_distillation,其配置文件路径在:`PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml`。使用前需对其进行必要的设置,如训练参数、数据集路径等。将部分关键配置展示如下: ```python #关键训练参数 use_gpu: true #是否使用显卡 epoch_num: 1200 #训练 epoch 个数 save_model_dir: ./output/rec_ppocr_v3_distillation #模型保存路径 save_epoch_step: 200 #每训练 200epoch,保存一次模型 eval_batch_step: [0, 100] #训练每迭代 100 次,进行一次验证 pretrained_model: ./PaddleOCR-release-2.5/pretrain_models/PPOCRv3/best_accuracy.pdparams #预训练模型路径 #训练集路径设置 Train: dataset: name: SimpleDataSet data_dir: ./RecTrainData/ #图片文件夹路径 label_file_list: - ./rec_train_label.txt #标签路径 ``` ### 模型微调 在 notebook 中运行如下命令对模型进行微调,其中 -c 传入的为配置好的模型文件路径 ```python %run PaddleOCR-release-2.5/tools/train.py \ -c PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml ``` 使用默认超参数,模型 `ch_PP-OCRv3_rec_distillation` 在训练集上训练 136 个 epoch 后,模型在验证集上的精度达到:96.11%,此后再无明显增长 ``` [2022/10/11 20:04:28] ppocr INFO: best metric, acc: 0.9610600272522444, norm_edit_dis: 0.9927426548965615, Teacher_acc: 0.9540291998159589, Teacher_norm_edit_dis: 0.9905629345025616, fps: 246.029195787707, best_epoch: 136 ``` ## 模型推理 ### 检测模型推理 在 notebook 中运行如下命令使用微调过的模型检测测试图片中的文字,其中: `Global.infer_img` 为图片路径或图片文件夹路径, `Global.pretrained_model` 为微调过的模型, `Global.save_res_path` 为推理结果保存路径 ```python %run PaddleOCR-release-2.5/tools/infer_det.py \ -c PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \ -o Global.infer_img="/input0/images" Global.pretrained_model="./output/ch_PP-OCR_V3_det/best_accuracy" Global.save_res_path="./output/det_infer_res/predicts.txt" ``` ### 识别模型推理 在 notebook 中运行如下命令使用微调过的模型检测测试图片中的文字,其中: `Global.infer_img` 为图片路径或图片文件夹路径, `Global.pretrained_model` 为微调过的模型, `Global.save_res_path` 为推理结果保存路径 ```python %run PaddleOCR-release-2.5/tools/infer_rec.py \ -c PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml \ -o Global.infer_img="./RecEvalData/" Global.pretrained_model="./output/rec_ppocr_v3_distillation/best_accuracy" Global.save_res_path="./output/rec_infer_res/predicts.txt" ``` ### 检测识别模型串联推理 #### 模型转换 在串联推理前首先需要将训练保存的模型转换成推理模型,分别执行如下检测命令即可。其中,`-c` 传入要转换模型的配置文件路径,`-o Global.pretrained_model` 为要被转换的模型文件,`Global.save_inference_dir` 为转换得到推理模型的储存路径 ```python # 检测模型转换 %run PaddleOCR-release-2.5/tools/export_model.py \ -c PaddleOCR-release-2.5/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \ -o Global.pretrained_model="./output/ch_PP-OCR_V3_det/best_accuracy" Global.save_inference_dir="./output/det_inference/" ``` W1011 07:10:20.363173 544 gpu_context.cc:278] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.4, Runtime API Version: 11.1 W1011 07:10:20.366801 544 gpu_context.cc:306] device: 0, cuDNN Version: 8.0. W1011 07:10:22.629678 544 gpu_context.cc:506] WARNING: device: . The installed Paddle is compiled with CUDNN 8.1, but CUDNN version in your machine is 8.0, which may cause serious incompatible bug. Please recompile or reinstall Paddle with compatible CUDNN version. [2022/10/11 07:10:24] ppocr INFO: load pretrain successful from ./output/ch_PP-OCR_V3_det/best_accuracy [2022/10/11 07:10:27] ppocr INFO: inference model is saved to ./output/det_inference/inference ```python # 识别模型转换 %run PaddleOCR-release-2.5/tools/export_model.py \ -c PaddleOCR-release-2.5/configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml \ -o Global.pretrained_model="./output/rec_ppocr_v3_distillation/best_accuracy" Global.save_inference_dir="./output/rec_inference/" ``` [2022/10/11 07:10:33] ppocr INFO: load pretrain successful from ./output/rec_ppocr_v3_distillation/best_accuracy [2022/10/11 07:10:35] ppocr INFO: inference model is saved to ./output/rec_inference/Teacher/inference [2022/10/11 07:10:36] ppocr INFO: inference model is saved to ./output/rec_inference/Student/inference #### 模型串联推理 转换完毕后,PaddleOCR 提供了检测和识别模型的串联工具,可以将训练好的任一检测模型和任一识别模型串联成两阶段的文本识别系统。输入图像经过文本检测、检测框矫正、文本识别、得分过滤四个主要阶段输出文本位置和识别结果。执行代码如下,其中 `image_dir` 为单张图像或者图像集合的路径,`det_model_dir` 为检测 inference 模型的路径,`rec_model_dir` 为识别 inference 模型的路径。可视化识别结果默认保存到 ./inference_results 文件夹里面。 ```python %run PaddleOCR-release-2.5/tools/infer/predict_system.py \ --image_dir="OCRTest" \ --det_model_dir="./output/det_inference/" \ --rec_model_dir="./output/rec_inference/Student/" ``` [2022/10/11 07:10:46] ppocr INFO: In PP-OCRv3, rec_image_shape parameter defaults to '3, 48, 320', if you are using recognition model with PP-OCRv2 or an older version, please set --rec_image_shape='3,32,320 [2022/10/11 07:10:48] ppocr DEBUG: dt_boxes num : 2, elapse : 1.0023341178894043 [2022/10/11 07:10:48] ppocr DEBUG: rec_res num : 2, elapse : 0.02405834197998047 [2022/10/11 07:10:48] ppocr DEBUG: 0 Predict time of OCRTest/1-122700001-OCR-LF-C01.jpg: 1.041s [2022/10/11 07:10:48] ppocr DEBUG: TTEMU3108252, 0.864 [2022/10/11 07:10:48] ppocr DEBUG: 22G1, 0.843 [2022/10/11 07:10:48] ppocr DEBUG: The visualized image saved in ./inference_results/1-122700001-OCR-LF-C01.jpg [2022/10/11 07:10:48] ppocr DEBUG: dt_boxes num : 1, elapse : 0.047757863998413086 [2022/10/11 07:10:48] ppocr DEBUG: rec_res num : 1, elapse : 0.016452789306640625 [2022/10/11 07:10:48] ppocr DEBUG: 1 Predict time of OCRTest/1-122720001-OCR-AH-A01.jpg: 0.073s [2022/10/11 07:10:48] ppocr DEBUG: The visualized image saved in ./inference_results/1-122720001-OCR-AH-A01.jpg [2022/10/11 07:10:48] ppocr DEBUG: dt_boxes num : 2, elapse : 0.05301952362060547 [2022/10/11 07:10:48] ppocr DEBUG: rec_res num : 2, elapse : 0.020509719848632812 [2022/10/11 07:10:48] ppocr DEBUG: 2 Predict time of OCRTest/1-122720001-OCR-AS-B01.jpg: 0.081s [2022/10/11 07:10:48] ppocr DEBUG: EITU1786393, 0.990 [2022/10/11 07:10:48] ppocr DEBUG: 45G1, 0.963 [2022/10/11 07:10:49] ppocr DEBUG: The visualized image saved in ./inference_results/1-122720001-OCR-AS-B01.jpg [2022/10/11 07:10:49] ppocr DEBUG: dt_boxes num : 2, elapse : 0.049460411071777344 [2022/10/11 07:10:49] ppocr DEBUG: rec_res num : 2, elapse : 0.020053625106811523 [2022/10/11 07:10:49] ppocr DEBUG: 3 Predict time of OCRTest/1-122720001-OCR-LB-C02.jpg: 0.077s [2022/10/11 07:10:49] ppocr DEBUG: LTU1, 0.814 [2022/10/11 07:10:49] ppocr DEBUG: 45G1, 0.997 [2022/10/11 07:10:49] ppocr DEBUG: The visualized image saved in ./inference_results/1-122720001-OCR-LB-C02.jpg [2022/10/11 07:10:49] ppocr DEBUG: dt_boxes num : 2, elapse : 0.051781654357910156 [2022/10/11 07:10:49] ppocr DEBUG: rec_res num : 2, elapse : 0.020511150360107422 [2022/10/11 07:10:49] ppocr DEBUG: 4 Predict time of OCRTest/1-122720001-OCR-RF-D01.jpg: 0.081s [2022/10/11 07:10:49] ppocr DEBUG: EITU1786393, 0.966 [2022/10/11 07:10:49] ppocr DEBUG: 45G1, 0.939 [2022/10/11 07:10:49] ppocr DEBUG: The visualized image saved in ./inference_results/1-122720001-OCR-RF-D01.jpg [2022/10/11 07:10:49] ppocr DEBUG: dt_boxes num : 0, elapse : 0.04465031623840332 [2022/10/11 07:10:49] ppocr DEBUG: rec_res num : 0, elapse : 1.430511474609375e-06 [2022/10/11 07:10:49] ppocr DEBUG: 5 Predict time of OCRTest/1-122728001-OCR-AH-A01.jpg: 0.049s [2022/10/11 07:10:49] ppocr DEBUG: The visualized image saved in ./inference_results/1-122728001-OCR-AH-A01.jpg [2022/10/11 07:10:49] ppocr INFO: The predict total time is 2.9623537063598633 ![](/img/blog/ocr-result.jpg) --- ## 教程:使用 Label Studio 的 machine learning backend 进行辅助标注和训练 本教程在 [基于 UIE 的命名实体识别](https://openbayes.com/blog/finetune-ner-in-uie) 的基础上,进一步通过集成 Label Studio 的 Machine Learning Backend 实现交互式预注释和模型训练等功能。 ## 环境准备 1. 在 OpenBayes 启动一个「模型训练」的容器,环境选择 `paddlepaddle-2.3` 资源选择 `vgpu` 或其他 GPU 容器 1. 在 Jupyter 中打开一个 Terminal 窗口,然后执行命令 `openbayes-label-studio` 启动 `label-studio` ![start](/img/docs/use-label-studio-ml-backend-with-uie/start.png) 在浏览器中打开红框中的链接,注册账户并登录 1. 打开另外一个 Terminal 窗口执行如下命令,安装 `label_studio_ml` ```shell pip install label_studio_ml pip uninstall attr ``` ## Machine Learning Backend 编写 完整的 Machine Learning Backend 见 `my_ml_backend.py` 文件。更多有关自定义机器学习后端编写的内容可参考 [Write your own ML backend](https://labelstud.io/guide/ml_create.html)。 简单来讲,`my_ml_backend.py` 内主要包含一个继承自 `LabelStudioMLBase` 的类,其内容可以分为以下三个主要部分: 1. `__init__` 方法,包含模型的加载和基本配置的初始化 2. `predict` 方法,用于为标注数据生成新的预测结果,其关键参数 `tasks` 就是 label studio 传递的原始数据 3. `fit` 方法,用于模型的训练,当点击页面上的 `Train` 按钮时,会调用此方法(具体的位置在下文会提到),其关键参数 `annotations` 就是 label studio 传递的已经标注了的数据 ### `__init__` 初始化方法 在 `__init__` 方法中定义和初始化需要的变量。`LabelStudioMLBase` 类提供了以下[几个可供使用的特殊变量](https://labelstud.io/guide/ml_create.html#Variables-available-from-LabelStudioMLBase): - self.label_config: 原始标签配置。 - self.parsed_label_config: 为项目提供结构化的 Label Studio 标签配置。 - self.train_output: 包含之前模型训练运行的结果,与训练调用部分中定义的 `fit()` 方法的输出相同。 如本教程的例子中,标签配置为: ``` ``` 相对应的 `parsed_label_config` 如下所示: ``` { 'label': { 'type': 'Labels', 'to_name': ['text'], 'inputs': [{ 'type': 'Text', 'value': 'text' }], 'labels': ['地名', '人名', '组织', '时间', '产品', '价格', '天气'], 'labels_attrs': { '地名': { 'value': '地名', 'background': '#FFA39E' }, '人名': { 'value': '人名', 'background': '#D4380D' }, '组织': { 'value': '组织', 'background': '#FFC069' }, '时间': { 'value': '时间', 'background': '#AD8B00' }, '产品': { 'value': '产品', 'background': '#D3F261' }, '价格': { 'value': '价格', 'background': '#389E0D' }, '天气': { 'value': '天气', 'background': '#5CDBD3' } } } } ``` 根据需要从 `self.parsed_label_config` 变量中提取需要的信息,并通过 PaddleNLP 的 Taskflow 加载用于预标注的模型。 ```python def __init__(self, **kwargs): # don't forget to initialize base class... super(MyModel, self).__init__(**kwargs) # print("parsed_label_config:", self.parsed_label_config) self.from_name, self.info = list(self.parsed_label_config.items())[0] assert self.info['type'] == 'Labels' assert self.info['inputs'][0]['type'] == 'Text' self.to_name = self.info['to_name'][0] self.value = self.info['inputs'][0]['value'] self.labels = list(self.info['labels']) # init uie model self.model = Taskflow("information_extraction", schema=self.labels, task_path= './checkpoint/model_best') ``` ### `predict` 预测方法 编写代码覆盖 `predict(tasks, **kwargs)` 方法。`predict()` 方法接受 [JSON 格式的 Label Studio 任务](https://labelstud.io/guide/tasks.html#Basic-Label-Studio-JSON-format) 并以 [Label Studio 接受的格式](https://labelstud.io/guide/predictions.html) 返回预测。此外,还可以包含和自定义可用于主动学习循环的预测分数。 `tasks` 参数包含了有关要进行预注释的任务的详细信息。具体的 task 格式如下所示: ```json { 'id': 16, 'data': { 'text': '新华社都柏林 6 月 28 日电(记者张琪)第二届“汉语桥”世界小学生中文秀爱尔兰赛区比赛结果日前揭晓,来自都柏林市的小学五年级学生埃拉·戈尔曼获得一等奖。' }, 'meta': {}, 'created_at': '2022-07-12T07:05:06.793411Z', 'updated_at': '2022-07-12T07:05:06.793424Z', 'is_labeled': False, 'overlap': 1, 'inner_id': 6, 'total_annotations': 0, 'cancelled_annotations': 0, 'total_predictions': 0, 'project': 2, 'updated_by': None, 'file_upload': 2, 'annotations': [], 'predictions': [] } ``` 具体的格式可以在 label studio 的数据列表里点击「show task source」查看: ![](/img/docs/use-label-studio-ml-backend-with-uie/show-task-raw-data.gif) 通过 Taskflow 进行预测需要从 `['data']['text']` 字段提取出原始文本,返回的 uie 预测结果格式如下所示: ```json { '地名': [{ 'text': '爱尔兰', 'start': 34, 'end': 37, 'probability': 0.9999107139090313 }, { 'text': '都柏林市', 'start': 50, 'end': 54, 'probability': 0.9997840536235998 }, { 'text': '都柏林', 'start': 3, 'end': 6, 'probability': 0.9999684097596173 }], '人名': [{ 'text': '埃拉·戈尔曼', 'start': 62, 'end': 68, 'probability': 0.9999879598978225 }, { 'text': '张琪', 'start': 15, 'end': 17, 'probability': 0.9999905824882092 }], '组织': [{ 'text': '新华社', 'start': 0, 'end': 3, 'probability': 0.999975681447097 }], '时间': [{ 'text': '6 月 28 日', 'start': 6, 'end': 11, 'probability': 0.9997071721989244 }, { 'text': '日前', 'start': 43, 'end': 45, 'probability': 0.9999804497706464 }] } ``` 从 uie 预测结果中提取相应的字段,构成 Label Studio 接受的预注释格式。命名实体识别任务的具体预注释示例可参考 [Import span pre-annotations for text](https://labelstud.io/guide/predictions.html#Import-span-pre-annotations-for-text)。 更多其他类型任务的具体预注释示例可参考 [Specific examples for pre-annotations](https://labelstud.io/guide/predictions.html#Specific-examples-for-pre-annotations)。 ```python def predict(self, tasks, **kwargs): from_name = self.from_name to_name = self.to_name model = self.model predictions = [] # loop every task for task in tasks: # print("predict task:", task) text = task['data'][self.value] uie = model(text)[0] # print("uie:", uie) result = [] scores = [] for key in uie: for item in uie[key]: result.append({ 'from_name': from_name, 'to_name': to_name, 'type': 'labels', 'value': { 'start': item['start'], 'end': item['end'], 'score': item['probability'], 'text': item['text'], 'labels': [key] } }) scores.append(item['probability']) result = sorted(result, key=lambda k: k["value"]["start"]) mean_score = np.mean(scores) if len(scores) > 0 else 0 predictions.append({ 'result': result, # optionally you can include prediction scores that you can use to sort the tasks and do active learning 'score': float(mean_score), 'model_version': 'uie-ner' }) return predictions ``` ### `fit` 训练方法 基于新注释更新模型。 编写代码覆盖 `fit()` 方法。`fit()` 方法接受 [JSON 格式的 Label Studio 注释](https://labelstud.io/guide/export.html#Label-Studio-JSON-format-of-annotated-tasks) 并返回任意一个可以存储模型相关信息的 JSON 字典。 ```python def fit(self, annotations, workdir=None, **kwargs): """ This is where training happens: train your model given list of annotations, then returns dict with created links and resources """ # print("annotations:", annotations) dataset = convert(annotations) with open("./doccano_ext.jsonl", "w", encoding="utf-8") as outfile: for item in dataset: outline = json.dumps(item, ensure_ascii=False) outfile.write(outline + "\n") os.system('python doccano.py \ --doccano_file ./doccano_ext.jsonl \ --task_type "ext" \ --save_dir ./data \ --splits 0.5 0.5 0') os.system('python finetune.py \ --train_path "./data/train.txt" \ --dev_path "./data/dev.txt" \ --save_dir "./checkpoint" \ --learning_rate 1e-6 \ --batch_size 4 \ --max_seq_len 512 \ --num_epochs 20 \ --model "uie-base" \ --init_from_ckpt "./checkpoint/model_best/model_state.pdparams" \ --seed 1000 \ --logging_steps 10 \ --valid_steps 100 \ --device "gpu"') return { 'path': workdir } ``` ## Machine Learning 集成 ### 启动 Machine Learning Backend 在终端中依次执行下列命令: ```shell # 初始化自定义机器学习后端 label-studio-ml init --script # 开启机器学习后端服务 label-studio-ml start ``` 成功启动后,在终端中可以看到 ML 后端的 URL。 ![backend-url](/img/docs/use-label-studio-ml-backend-with-uie/backend-url.png) > **注意:** 对于不同的 OpenBayes 算力容器,红框中的外部访问链接各不相同,直接使用本教程中的链接是无效的,需用终端中提示的链接进行替换。也可以使用 `localhost` 替换其中的 IP 地址。 ### 添加 ML Backend 到 Label Studio 在启动自定义机器学习后端之后,就可以将其添加到 Label Studio 项目中。 具体步骤如下: 1. 点击 **Settings** - **Machine Learning** - **Add Model** ![add-model](/img/docs/use-label-studio-ml-backend-with-uie/add-model.png) 2. 填入标题、ML 后端的 URL、描述(可选)等内容 ![add-url](/img/docs/use-label-studio-ml-backend-with-uie/add-url.png) 3. 选择 **Use for interactive preannotations** 打开交互式预注释功能(可选) 4. 点击 **Validate and Save** ![machine-learning](/img/docs/use-label-studio-ml-backend-with-uie/machine-learning.png) 如果出现报错,可查看 [机器学习疑难解答](https://labelstud.io/guide/ml_troubleshooting.html)。 除了通过 Label Studio 的 UI 界面添加 ML 后端以外,还可以 [使用 API 添加 ML 后端](https://labelstud.io/api/#operation/api_ml_create)。 ### 获取交互式预注释 若要使用交互式预注释功能,需在添加 ML Backend 时打开 **Use for interactive preannotations** 选项。如未打开,可点击 **Edit** 进行编辑。 然后随便点击一个数据,label studio 就会悄悄运行刚才的 ml backend 生成新的标注了。 ![](/img/docs/use-label-studio-ml-backend-with-uie/get-prediction-after-click.gif) 查看预标注好的数据,如有必要,对标注进行修改。 ![](/img/docs/use-label-studio-ml-backend-with-uie/correct-labels.gif) 本例中,预标注的结果中「经开区」和「局地小冰雹」没有被识别出来。修改完成或预标注的结果已经符合预期,点击 **Submit** 提交标注结果。 ### 训练模型 在标注了至少一项任务之后,就可以开始训练模型了。 点击 **Settings** - **Machine Learning** - **Start Training** 开始训练。 ![start-training](/img/docs/use-label-studio-ml-backend-with-uie/trigger-train-in-label-studio-ml-backend.gif) 然后返回启动 label-studio-ml-backend 的窗口可以看到训练的流程启动了。 除此之外,还可以 [使用 API 训练模型](https://labelstud.io/api/#operation/api_ml_train_create) 或 [使用 webhooks 触发训练](https://labelstud.io/guide/ml_create.html#Trigger-training-with-webhooks)。 ## 总结 - Label Studio 所提供的 Machine Learning Backend 提供了一个比较灵活的辅助人工标注的框架,我们通过它确实可以加快 nlp 数据的标注 - Label Studio 的 enterprise 版本提供了 [Active Learning](https://labelstud.io/guide/active_learning.html) 的流程,不过从其描述看这个流程并不完美,尤其是 `fit` 部分,由于 Label Studio 低估了「Train」所花费的时间,所以每次标注都自动训练的流程可能并不会那么顺滑 - 我们并没有使用 Label Studio 所提供的「Auto-Annotation」的功能,因为它存在重复标注的问题 - 既然 Label Studio 提供了它的 api 那其实可玩的东西还是很多的,配合 webhook 等内容可能会让这个标注和训练的流程做的更加高效