ml-workspace

GitHub
3.5k 456 简单 1 次阅读 5天前Apache-2.0视频音频数据工具图像语言模型Agent开发框架其他插件
AI 解读 由 AI 自动生成,仅供参考

ml-workspace 是一款专为机器学习和数据科学打造的一站式网页版集成开发环境(IDE)。它旨在解决传统本地开发中环境配置繁琐、依赖库冲突以及跨设备协作困难等痛点,让用户无需花费数小时安装配置,即可在几分钟内启动一个功能完备的开发平台。

这款工具非常适合机器学习工程师、数据科学家以及相关领域的研究人员使用。无论是需要快速验证算法原型的开发者,还是希望专注于模型训练而非运维的研究者,都能从中受益。ml-workspace 基于 Docker 部署,支持在 Mac、Linux 和 Windows 上轻松运行。

其核心亮点在于“开箱即用”的丰富预装生态,内置了 TensorFlow、PyTorch、Keras、Sklearn 等主流深度学习框架,并完美集成了 JupyterLab、VS Code Web 版以及 Tensorboard 等开发监控工具。更独特的是,它不仅提供代码编辑功能,还通过浏览器提供完整的 Linux 桌面图形界面(GUI),支持无缝的 Git 版本控制、硬件资源实时监控,并允许用户通过单一端口从任何地方通过 Web、SSH 或 VNC 进行远程访问。这使得 ml-workspace 成为构建高效、灵活且可远程协作的机器学习工作流的理想选择。

使用场景

某初创公司的数据科学团队需要在本地服务器上快速搭建一个支持多框架(TensorFlow、PyTorch)且具备远程协作能力的机器学习开发环境。

没有 ml-workspace 时

  • 环境配置繁琐:每位新入职的算法工程师需花费半天时间手动安装 Python、CUDA 驱动及各类依赖库,常因版本冲突导致环境不可用。
  • 工具链割裂:开发者需在本地 IDE、独立的 Jupyter 服务和命令行终端之间频繁切换,缺乏统一的集成界面。
  • 远程访问困难:团队成员无法直接从家中浏览器安全访问公司服务器的桌面或代码编辑器,必须配置复杂的 SSH 隧道或 VNC。
  • 监控缺失:模型训练过程中,缺乏直观的工具实时监控 GPU 利用率和训练指标,往往等到报错才发现资源瓶颈。

使用 ml-workspace 后

  • 一键启动环境:只需一条 Docker 命令,几分钟内即可部署预装了主流数据科学库和驱动的完美环境,新人入职即刻开工。
  • 全功能 Web 集成:通过浏览器即可同时访问 JupyterLab、VS Code 和完整 Linux 桌面,所有开发工具在同一端口无缝切换。
  • 随时随地接入:团队成员无论身处何地,仅需通过网页或 SSH 即可安全连接至中央服务器,像操作本地机器一样进行远程开发。
  • 内置智能监控:集成 Tensorboard 和 Netdata,开发者可实时可视化训练曲线与硬件状态,迅速定位并优化性能问题。

ml-workspace 将原本数天的环境搭建与整合工作压缩至分钟级,让数据科学家能专注于核心算法创新而非运维琐事。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明 (建议配置 --shm-size 512m 以防止崩溃)

依赖
notes该工具基于 Docker 部署,需预先安装 Docker。默认工作目录为容器内的 /workspace,必须通过挂载卷 (-v) 将本地目录映射到 /workspace 以持久化数据,否则重启后数据会丢失。支持通过环境变量配置认证(推荐 Jupyter Token 或 Nginx Basic Auth)和 SSL。可通过单个端口访问 Web IDE、SSH 或 VNC。
python未说明
Tensorflow
PyTorch
Keras
Sklearn
Jupyter
VS Code
Tensorboard
Netdata
ml-workspace hero image

快速开始


面向机器学习的一站式基于Web的开发环境

开始使用功能与截图支持报告 bug常见问题解答已知问题贡献

ML 工作空间是一款专为机器学习和数据科学打造的一站式基于 Web 的集成开发环境。它部署简单,只需几分钟即可启动,帮助您在本地机器上高效地构建机器学习解决方案。该工作空间是开发者的终极工具,预装了多种流行的数据科学库(如 TensorFlow、PyTorch、Keras、Scikit-learn)和开发工具(如 Jupyter、VS Code、TensorBoard),并经过完美配置、优化和集成。

亮点

  • 💫  基于 Web 的 Jupyter、JupyterLab 和 Visual Studio Code 集成开发环境。
  • 🗃  预装大量流行的数据科学库和工具。
  • 🖥  可通过 Web 浏览器访问完整的 Linux 桌面 GUI。
  • 🔀  无缝集成 Git,专为笔记本优化。
  • 📈  通过 TensorBoard 和 Netdata 集成硬件与训练监控。
  • 🚪  可通过 Web、SSH 或 VNC 在单个端口下从任何地方访问。
  • 🎛  可作为远程内核(Jupyter)或远程机器(VS Code)通过 SSH 使用。
  • 🐳  可通过 Docker 轻松部署在 Mac、Linux 和 Windows 上。

开始使用

在 PWD 中试用

先决条件

工作空间需要在您的机器上安装 Docker📖 安装指南)。

启动单个实例

部署单个工作空间实例非常简单:

docker run -p 8080:8080 mltooling/ml-workspace:0.13.2

瞧,就这么简单!现在,Docker 会将最新的工作空间镜像拉取到您的机器上。这可能需要几分钟时间,具体取决于您的网络速度。一旦工作空间启动,您就可以通过 http://localhost:8080 访问它。

如果是在其他机器上启动,或者使用了不同的端口,请务必使用该机器的 IP/DNS 地址以及暴露的端口。

为了以生产级方式部署单个实例,我们建议至少应用以下选项:

docker run -d \
    -p 8080:8080 \
    --name "ml-workspace" \
    -v "${PWD}:/workspace" \
    --env AUTHENTICATE_VIA_JUPYTER="mytoken" \
    --shm-size 512m \
    --restart always \
    mltooling/ml-workspace:0.13.2

此命令将在后台运行容器(-d),将您当前的工作目录挂载到 /workspace 文件夹中(-v),通过提供的令牌保护工作空间(--env AUTHENTICATE_VIA_JUPYTER),提供 512MB 的共享内存(--shm-size)以防止意外崩溃(请参阅 已知问题部分),并在系统重启时保持容器运行(--restart always)。您可以在 此处 找到 docker run 的更多选项,并在 下方的配置部分 查看工作空间的配置选项。

配置选项

工作区提供了多种配置选项,可通过设置环境变量来使用(通过 docker run 选项:--env)。

配置选项(点击展开...)
变量 描述 默认值
WORKSPACE_BASE_URL Jupyter 及所有其他工具将从该基础 URL 下访问。 /
WORKSPACE_SSL_ENABLED 启用或禁用 SSL。当设置为 true 时,必须将证书(cert.crt)挂载到 /resources/ssl 目录下;否则,容器会生成自签名证书。 false
WORKSPACE_AUTH_USER 基本认证用户名。要启用基本认证,必须同时设置用户名和密码。我们建议使用 AUTHENTICATE_VIA_JUPYTER 来保护工作区的安全。
WORKSPACE_AUTH_PASSWORD 基本认证用户密码。要启用基本认证,必须同时设置用户名和密码。我们建议使用 AUTHENTICATE_VIA_JUPYTER 来保护工作区的安全。
WORKSPACE_PORT 配置工作区代理的主要容器内端口。在大多数情况下,不应更改此配置,而应通过 Docker 的端口映射来访问工作区,而不是直接修改工作区的端口配置。 8080
CONFIG_BACKUP_ENABLED 自动备份和恢复用户配置到持久化 /workspace 文件夹中,例如用户的 .ssh、.jupyter 或 .gitconfig 等主目录文件。 true
SHARED_LINKS_ENABLED 启用或禁用通过外部链接共享资源的功能。这用于实现文件共享、访问工作区内网端口以及便捷的基于命令的 SSH 设置。所有共享链接都通过令牌进行保护。然而,存在一定风险,因为令牌在共享后难以撤销且不会过期。 true
INCLUDE_TUTORIALS 如果为 true,则在容器启动时会将一部分教程和入门笔记本添加到 /workspace 文件夹中,但仅当该文件夹为空时才会执行此操作。 true
MAX_NUM_THREADS 在使用各种常用库(MKL、OPENBLAS、OMP、NUMBA 等)进行计算时使用的线程数。您也可以使用 auto 让工作区根据可用 CPU 资源动态确定线程数。此配置可在工作区内部由用户覆盖。通常,将其设置为等于或低于工作区可用的 CPU 核心数是比较合适的。 auto
Jupyter 配置:
SHUTDOWN_INACTIVE_KERNELS 在给定超时后自动关闭不活跃的内核,以释放内存或 GPU 资源。值可以是秒数,也可以设置为 true,此时默认超时时间为 48 小时。 false
AUTHENTICATE_VIA_JUPYTER 如果为 true,则所有 HTTP 请求都将针对 Jupyter 服务器进行身份验证,这意味着 Jupyter 配置的身份验证方法也将用于其他工具。可以通过设置为 false 来禁用此功能。任何其他值都会激活此身份验证,并作为 Jupyter 的 NotebookApp.token 配置应用到令牌中。 false
NOTEBOOK_ARGS 通过命令行参数添加和覆盖 Jupyter 配置选项。有关所有选项,请参阅 此概述

数据持久化

要使数据持久化,需要将卷挂载到 /workspace 目录下(通过 docker run 选项:-v)。

详细信息(点击展开...)

容器内的默认工作目录是 /workspace,这也是 Jupyter 实例的根目录。/workspace 目录旨在用于存储所有重要的工作成果。服务器其他目录中的数据(例如 /root)可能会在容器重启时丢失。

启用身份验证

我们强烈建议通过以下两种方式之一启用身份验证。对于这两种方式,用户在访问任何预装工具时都需要进行身份验证。

身份验证仅适用于通过主工作区端口(默认:8080)访问的所有工具。这适用于所有预装工具以及 访问端口 功能。如果您暴露了容器的其他端口,请务必也为其启用身份验证!

详细信息(点击展开...)

基于 Jupyter 的令牌身份验证(推荐)

通过 AUTHENTICATE_VIA_JUPYTER 变量激活基于 Jupyter 身份验证实现的令牌身份验证:

docker run -p 8080:8080 --env AUTHENTICATE_VIA_JUPYTER="mytoken" mltooling/ml-workspace:0.13.2

您还可以使用 <generated> 让 Jupyter 生成一个随机令牌,并将其打印到容器日志中。如果设置为 true,则不会设置任何令牌,但会确保对工作区中任何工具的请求都会通过 Jupyter 实例检查用户是否已身份验证。这通常用于 JupyterHub 等工具,这些工具会配置自己的身份验证方式。

基于 Nginx 的基本身份验证

通过 WORKSPACE_AUTH_USERWORKSPACE_AUTH_PASSWORD 变量激活基本身份验证:

docker run -p 8080:8080 --env WORKSPACE_AUTH_USER="user" --env WORKSPACE_AUTH_PASSWORD="pwd" mltooling/ml-workspace:0.13.2

基本身份验证是通过 Nginx 代理配置的,与另一种方式相比可能性能更好。因为在使用 AUTHENTICATE_VIA_JUPYTER 时,每次对工作区中任何工具的请求都需要通过 Jupyter 实例检查用户(基于请求的 Cookie)是否已身份验证。

启用 SSL/HTTPS

我们建议启用 SSL,以便可以通过 HTTPS(加密通信)访问工作区。SSL 加密可以通过 WORKSPACE_SSL_ENABLED 变量来激活。

详情(点击展开…)

当设置为 true 时,必须将 cert.crtcert.key 文件挂载到 /resources/ssl 目录;或者,如果证书文件不存在,则容器会生成自签名证书。例如,如果本地系统的 /path/with/certificate/files 目录下包含主机域名的有效证书文件(cert.crtcert.key),则可以在工作区中按如下方式使用:

docker run \
    -p 8080:8080 \
    --env WORKSPACE_SSL_ENABLED="true" \
    -v /path/with/certificate/files:/resources/ssl:ro \
    mltooling/ml-workspace:0.13.2

如果您希望在公共域名上托管工作区,我们建议使用 Let's Encrypt 为您的域名获取受信任的证书。要将生成的证书(例如通过 certbot 工具)用于工作区,privkey.pem 对应于 cert.key 文件,而 fullchain.pem 则对应于 cert.crt 文件。

启用 SSL 支持后,您必须通过 https:// 访问工作区,而不是普通的 http://

限制内存和 CPU

默认情况下,工作区容器没有资源限制,可以使用宿主机内核调度器允许的任意数量的资源。Docker 提供了方法,可以通过设置 docker run 命令的运行时配置标志来控制容器可以使用的内存或 CPU 数量。

工作区至少需要 2 个 CPU 和 500MB 内存才能稳定运行并正常使用。

详情(点击展开…)

例如,以下命令将工作区的资源限制为最多 8 个 CPU、16GB 内存和 1GB 共享内存(参见已知问题):

docker run -p 8080:8080 --cpus=8 --memory=16g --shm-size=1G mltooling/ml-workspace:0.13.2

📖 有关更多选项和资源限制的文档,请参阅Docker 官方指南

启用代理

如果需要使用代理,可以通过 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量传递代理配置。

工作区镜像版本

除了主工作区镜像(mltooling/ml-workspace)之外,我们还提供了其他扩展功能或缩小镜像体积的版本,以满足多种使用场景的需求。

极简版

详细信息(点击展开...)

极简版镜像(mltooling/ml-workspace-minimal)是我们最小的镜像,包含了功能部分中描述的大多数工具和特性,但去除了主镜像中预装的大部分 Python 库。任何被排除的 Python 库或工具都可以在运行时由用户手动安装。

docker run -p 8080:8080 mltooling/ml-workspace-minimal:0.13.2

R 版

详细信息(点击展开...)

R 版镜像(mltooling/ml-workspace-r)基于我们的默认工作区镜像,并在此基础上添加了 R 解释器、R Jupyter 内核、RStudio 服务器(可通过“打开工具 -> RStudio”访问),以及 R 生态系统中的多种流行包。

docker run -p 8080:8080 mltooling/ml-workspace-r:0.12.1

Spark 版

详细信息(点击展开...)

Spark 版镜像(mltooling/ml-workspace-spark)基于我们的 R 版工作区镜像,并在此基础上添加了 Spark 运行时、Spark Jupyter 内核、Zeppelin Notebook(可通过“打开工具 -> Zeppelin”访问)、PySpark、Hadoop、Java 内核,以及一些额外的库和 Jupyter 扩展。

docker run -p 8080:8080 mltooling/ml-workspace-spark:0.12.1

GPU 版

详细信息(点击展开...)

目前,GPU 版仅支持 CUDA 11.2。未来可能会增加对其他 CUDA 版本的支持。

GPU 版镜像(mltooling/ml-workspace-gpu)基于我们的默认工作区镜像,并在此基础上添加了 CUDA 10.1 以及适用于 GPU 的各种机器学习库(如 TensorFlow、PyTorch、CNTK、JAX 等)。此 GPU 镜像对系统有以下额外要求:

  • 显卡的 NVIDIA 驱动程序。驱动程序需兼容 CUDA 11.2,版本为 >=460.32.03📖 说明)。
  • (Docker ≥ 19.03)NVIDIA 容器工具包(📖 说明)。
docker run -p 8080:8080 --gpus all mltooling/ml-workspace-gpu:0.13.2
  • (Docker < 19.03)NVIDIA Docker 2.0(📖 说明)。
docker run -p 8080:8080 --runtime nvidia --env NVIDIA_VISIBLE_DEVICES="all" mltooling/ml-workspace-gpu:0.13.2

GPU 版还提供了一些额外的配置选项,如下所述:

变量 描述 默认值
NVIDIA_VISIBLE_DEVICES 控制工作区内可访问的 GPU。默认情况下,主机上的所有 GPU 都可在工作区内访问。您可以使用 `all`、`none`,或者指定一个用逗号分隔的设备 ID 列表(例如 `0,1`)。您可以通过在主机上运行 `nvidia-smi` 来查看可用的设备 ID 列表。 all
CUDA_VISIBLE_DEVICES 控制工作区内运行的 CUDA 应用程序可见的 GPU。默认情况下,工作区可访问的所有 GPU 都是可见的。要限制应用程序可见的 GPU,请根据工作区内的可用设备(运行 `nvidia-smi`)提供一个内部设备 ID 的逗号分隔列表(例如 `0,2`)。与 `NVIDIA_VISIBLE_DEVICES` 不同的是,工作区用户仍可通过在工作区内覆盖此配置来访问其他 GPU。
TF_FORCE_GPU_ALLOW_GROWTH 默认情况下,TensorFlow 图的第一个执行会分配大部分 GPU 内存。虽然这种行为对于生产流水线来说可能是理想的,但对于交互式使用则不太理想。使用 `true` 可启用动态 GPU 内存分配,而使用 `false` 则会指示 TensorFlow 在执行时一次性分配所有内存。 true

多用户设置

工作区被设计为单用户开发环境。对于多用户设置,我们建议部署 🧰 ML Hub。ML Hub 基于 JupyterHub,其任务是为多个用户启动、管理和代理工作区实例。

部署(点击展开...)

ML Hub 可以轻松地在单个服务器上(通过 Docker)或集群上(通过 Kubernetes)搭建多用户环境,并支持多种使用场景和身份验证提供商。您可以通过以下方式试用 ML Hub:

docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock mltooling/ml-hub:latest

有关 ML Hub 的更多信息和文档,请查看 GitHub 网站



支持

该项目由 Benjamin RäthleinLukas MasuchJan Kalkan 维护。请理解,我们无法通过电子邮件提供个人支持。我们还认为,公开分享的帮助更有价值,这样更多人可以从中受益。

类型 渠道
🚨  错误报告
🎁  功能请求
👩‍💻  使用问题
📢  公告
❓  其他请求


功能

Jupyter桌面 GUIVS CodeJupyterLabGit 集成文件共享访问端口TensorBoard可扩展性硬件监控SSH 访问远程开发作业执行

工作区配备了一系列一流的开源开发工具,以帮助完成机器学习工作流。其中许多工具可以从 Jupyter(工作区的主要应用程序)的“Open Tool”菜单中启动:

在您的工作区内,您拥有 完全的 root 和 sudo 权限,可以通过终端安装任何所需的库或工具(例如 pipapt-getcondanpm)。您可以在 可扩展性 部分找到更多扩展工作区的方法

Jupyter

Jupyter Notebook 是一个基于 Web 的交互式环境,用于编写和运行代码。Jupyter 的主要组成部分包括文件浏览器、笔记本编辑器和内核。文件浏览器为 /workspace 目录中的所有笔记本、文件和文件夹提供了一个交互式文件管理器。

可以通过点击列表顶部的“New”下拉按钮并选择所需的语言内核来创建一个新的笔记本。

您还可以通过在文件浏览器中选择“New -> Terminal”来启动交互式的 终端 实例。

笔记本编辑器使用户能够编写包含实时代码、Markdown 文本、Shell 命令、LaTeX 公式、交互式小部件、图表和图像的文档。这些笔记本文档提供了计算过程的完整且自包含的记录,可以转换为各种格式并与他人共享。

此工作区已激活多种 第三方 Jupyter 扩展。您可以在 nbextensions 配置器中配置这些扩展:文件浏览器上的 nbextensions 选项卡

笔记本允许使用多种不同的编程语言运行代码。对于用户打开的每个笔记本文档,Web 应用程序都会启动一个 内核 来运行该笔记本的代码并返回输出。此工作区预装了 Python 3 内核。可以安装其他内核以访问其他语言(例如 R、Scala、Go)或额外的计算资源(例如 GPU、CPU、内存)。

Python 2 已被弃用,我们不建议使用它。不过,您仍然可以通过以下命令安装 Python 2.7 内核:/bin/bash /resources/tools/python-27.sh

桌面 GUI

该工作区通过 noVNC 提供基于 HTTP 的 VNC 访问,从而允许您使用功能齐全的桌面 GUI 来访问和操作工作区。要访问此桌面 GUI,请转到“Open Tool”,选择“VNC”,然后单击“Connect”按钮。如果系统提示输入密码,请使用 vncpassword

连接成功后,您将看到一个桌面 GUI,允许您安装并使用功能完善的网页浏览器或其他适用于 Ubuntu 的工具。在桌面上的“Tools”文件夹中,您会找到一系列安装脚本,可以方便地安装一些最常用的开发工具,例如 Atom、PyCharm、R-Runtime、R-Studio 或 Postman(只需双击相应的脚本即可)。

剪贴板: 如果您希望在本地机器与工作区之间共享剪贴板,可以按照以下说明使用复制粘贴功能:

💡 长时间运行的任务: 对于长时间运行的 Jupyter 作业,请使用桌面 GUI。通过从工作区桌面 GUI 的浏览器中运行笔记本,即使您已断开浏览器与笔记本的连接,所有输出仍会同步更新到笔记本中。

Visual Studio Code

Visual Studio Code(“Open Tool -> VS Code”)是一款开源、轻量级但功能强大的代码编辑器,内置对多种语言的支持,并拥有丰富的扩展生态系统。它将源代码编辑器的简洁性与 IntelliSense 代码补全和调试等强大的开发者工具相结合。该工作区将 VS Code 集成为基于 Web 的应用程序,可通过基于浏览器的优秀项目 code-server 访问。这使您可以根据自己的喜好自定义各项功能,并安装任意数量的第三方扩展。

此外,该工作区还提供了 VS Code 与 Jupyter 的集成,允许您为任何选定的文件夹打开一个 VS Code 实例,如下所示:

JupyterLab

JupyterLab(“Open Tool -> JupyterLab”)是 Project Jupyter 的下一代用户界面。它在一个灵活而强大的用户界面中提供了经典 Jupyter Notebook 的所有熟悉组件(笔记本、终端、文本编辑器、文件浏览器、富输出等)。此 JupyterLab 实例预装了一些有用的扩展,例如 jupyterlab-tocjupyterlab-gitjuptyterlab-tensorboard

Git 集成

版本控制是高效协作的关键环节。为了使这一过程尽可能顺畅,我们集成了一个专门用于推送单个笔记本的定制 Jupyter 扩展、一个功能完善的基于 Web 的 Git 客户端(ungit)、一个可将纯文本文件(如 .py.md)作为笔记本打开并编辑的工具(jupytext),以及一个笔记本合并工具(nbdime)。此外,JupyterLab 和 VS Code 也提供基于 GUI 的 Git 客户端。

克隆仓库

对于通过 https 克隆仓库,我们建议导航到目标根目录,然后单击如下所示的“git”按钮:

这可能会要求您进行一些必要的设置,随后会打开 ungit,这是一个具有简洁直观界面的基于 Web 的 Git 客户端,便于同步您的代码工件。在 ungit 中,您可以克隆任何仓库。如果需要身份验证,系统将提示您输入凭据。

推送、拉取、合并及其他 Git 操作

要将单个笔记本提交并推送到远程 Git 仓库,我们建议使用集成在 Jupyter 中的 Git 插件,如下所示:

对于更高级的 Git 操作,我们建议使用 ungit。借助 ungit,您可以执行大多数常见的 Git 操作,如推送、拉取、合并、分支、标签、检出等。

笔记本的差异比较与合并

Jupyter 笔记本非常强大,但它们通常是体积庞大的文件,采用非常特殊的 JSON 文件格式。为了实现通过 Git 进行无缝的差异比较和合并,该工作区预装了 nbdime。nbdime 能够理解笔记本文档的结构,因此在比较和合并笔记本时会自动做出智能决策。如果出现合并冲突,nbdime 会确保笔记本仍然能够被 Jupyter 读取,如下所示:

此外,该工作区还预装了 jupytext,这是一个可以读取和写入纯文本文件的 Jupyter 插件。这使得您能够在 Jupyter 中将脚本或 Markdown 文件(如 .py.md)作为笔记本打开、编辑和运行。在下面的截图中,我们通过 Jupyter 打开了一个 Markdown 文件:

结合 Git 使用时,jupytext 可以提供清晰的差异历史记录,并轻松解决版本冲突。借助这两款工具,使用 Git 协作处理 Jupyter 笔记本将变得十分简便。

文件共享

工作区提供了一项功能,可通过受令牌保护的链接与任何人共享任意文件或文件夹。要通过链接共享数据,请从 Jupyter 目录树中选择任意文件或文件夹,然后单击如下截图所示的“分享”按钮:

这将生成一个由令牌保护的唯一链接,任何拥有该链接的人都可以通过 Filebrowser 界面查看并下载所选数据:

要停用或管理(例如授予编辑权限)共享链接,请通过 Open Tool -> Filebrowser 打开 Filebrowser,并选择 Settings->User Management

访问端口

您可以通过选择 Open Tool -> Access Port 安全地访问工作区内的任何内部端口。借助此功能,您可以直接使用浏览器访问工作区内部运行的 REST API 或 Web 应用程序。该功能使开发者能够直接在工作区内构建、运行、测试和调试 REST API 或 Web 应用程序。

如果您希望使用 HTTP 客户端或与他人共享对特定端口的访问权限,可以选择“获取可共享链接”选项。这将生成一个受令牌保护的链接,任何拥有该链接的人都可以使用它来访问指定的端口。

HTTP 应用必须从相对 URL 路径解析,或配置基础路径(/tools/PORT/)。以这种方式公开的工具受到工作区身份验证系统的保护!如果您决定不使用此功能来公开工具,而是自行发布容器的其他端口,请务必通过身份验证机制对其进行保护!

示例(点击展开...)
  1. 在工作区的终端中运行以下命令,在端口 1234 上启动一个 HTTP 服务器:python -m http.server 1234
  2. 选择 Open Tool -> Access Port,输入端口 1234,并选择“获取可共享链接”选项。
  3. 单击“Access”,您将看到 Python 的 http.server 提供的内容。
  4. 打开的链接也可以分享给其他人,或从外部应用程序中调用(例如,尝试在 Chrome 的无痕模式下访问)。

SSH 访问

SSH 提供了一组强大的功能,可帮助您更高效地完成开发任务。您可以通过选择 Open Tool -> SSH 轻松设置到工作空间的安全无密码 SSH 连接。这将生成一条安全的设置命令,可在任何 Linux 或 Mac 机器上运行,以配置与工作空间之间的无密码且安全的 SSH 连接。或者,您也可以下载设置脚本并直接运行(而不使用命令)。

该设置脚本仅适用于 Mac 和 Linux 系统,目前不支持 Windows。

只需在您希望建立连接的工作站上运行设置命令或脚本,并为该连接命名(例如 my-workspace)。在设置过程中,系统可能会提示您提供一些额外信息,比如在安装了 remote_ikernel 的情况下安装远程内核。成功设置并测试无密码 SSH 连接后,您只需执行 ssh my-workspace 即可安全地连接到工作空间。

除了能够在远程机器上执行命令之外,SSH 还提供了多种其他功能,可改善您的开发工作流程,具体说明如下。

端口隧道(点击展开...)

通过 SSH 连接,可以实现从远程机器到本地机器,或反之的端口隧道转发。例如,您可以将工作空间内部的 5901 端口(VNC 服务器)暴露到本地机器的 5000 端口,方法是执行以下命令:

ssh -nNT -L 5000:localhost:5901 my-workspace

若要将本地机器上的应用端口暴露到工作空间,请使用 -R 选项(而非 -L)。

隧道建立后,您可以在本地机器上使用自己喜欢的 VNC 查看器,连接到 vnc://localhost:5000(默认密码:vncpassword)。为了使隧道连接更加稳定可靠,我们建议使用 autossh 自动重启 SSH 隧道,以防连接中断:

autossh -M 0 -f -nNT -L 5000:localhost:5901 my-workspace

端口隧道在您于工作空间内启动了基于服务器的工具,并希望将其对外部机器开放时非常有用。默认情况下,工作空间已在不同端口上运行多种工具,例如:

  • 8080:主工作空间端口,可访问所有集成工具。
  • 8090:Jupyter 服务器。
  • 8054:VS Code 服务器。
  • 5901:VNC 服务器。
  • 22:SSH 服务器。

有关所有工具的端口信息,请参阅 supervisor 配置文件

📖 如需了解更多关于端口隧道/转发的信息,建议参考这篇指南

通过 SCP 复制数据(点击展开...)

SCP 允许通过 SSH 连接,在不同机器之间安全地复制文件和目录。例如,要将本地文件(./local-file.txt)复制到工作空间内的 /workspace 目录中,可执行以下命令:

scp ./local-file.txt my-workspace:/workspace

若要将 my-workspace 中的 /workspace 目录复制到本地机器的工作目录中,则可执行:

scp -r my-workspace:/workspace .

📖 如需了解更多关于 scp 的信息,建议参考这篇指南

通过 Rsync 同步数据(点击展开...)

Rsync 是一种用于在不同机器之间高效传输和同步文件的工具(例如通过 SSH 连接),它通过比较文件的修改时间和大小来确定需要更新的内容。每次运行 rsync 命令时,它都会自动识别哪些文件需要更新,相比使用 scp 或 sftp 等工具更为高效便捷。例如,要将本地文件夹(./local-project-folder/)中的所有内容同步到工作空间内的 /workspace/remote-project-folder/ 文件夹中,可执行以下命令:

rsync -rlptzvP --delete --exclude=".git" "./local-project-folder/" "my-workspace:/workspace/remote-project-folder/"

如果工作空间内的文件夹中有更改,您也可以通过交换源和目标参数,将这些更改同步回本地文件夹:

rsync -rlptzvP --delete --exclude=".git" "my-workspace:/workspace/remote-project-folder/" "./local-project-folder/"

每当您需要同步最新版本的文件时,都可以重新运行这些命令。Rsync 只会传输那些确实需要更新的文件。

📖 更多关于 rsync 的信息,请参阅此 man 页面

通过 SSHFS 挂载文件夹(点击展开...)

除了复制和同步数据外,SSH 连接还可用于通过 SSHFS 将远程机器上的目录挂载到本地文件系统中。例如,要将 my-workspace/workspace 目录挂载到本地路径(如 /local/folder/path),可执行以下命令:

sshfs -o reconnect my-workspace:/workspace /local/folder/path

远程目录挂载完成后,您可以像操作本地目录和文件一样与远程文件系统进行交互。

📖 如需了解更多关于 sshfs 的信息,建议参考这篇指南

远程开发

工作区可以集成并用作多种流行开发工具和 IDE 的远程运行时(也称为远程内核/机器/解释器),例如 Jupyter、VS Code、PyCharm、Colab 或 Atom Hydrogen。通过这种方式,您可以将本地运行的常用开发工具连接到远程机器以执行代码。这使得您能够在远程托管的计算资源上获得与本地相同的开发体验。

这些集成通常需要从本地机器到工作区的无密码 SSH 连接。要设置 SSH 连接,请按照 SSH 访问 部分中说明的步骤操作。

Jupyter - 远程内核(点击展开...)

工作区可以通过 remote_ikernel 工具添加到 Jupyter 实例中作为远程内核。如果您已在本地机器上安装了 remote_ikernel(pip install remote_ikernel),工作区的 SSH 设置脚本会自动为您提供设置远程内核连接的选项。

在远程机器上运行内核时,笔记本本身会保存在本地文件系统上,但内核仅能访问运行该内核的远程机器的文件系统。如果需要同步数据,可以使用 rsync、scp 或 sshfs,具体方法请参阅 SSH 访问 部分。

如果您希望手动设置和管理远程内核,可以使用 remote_ikernel 命令行工具,如下所示:

# 将 my-workspace 替换为工作区 SSH 连接的名称
remote_ikernel manage --add \
    --interface=ssh \
    --kernel_cmd="ipython kernel -f {connection_file}" \
    --name="ml-server (Python)" \
    --host="my-workspace"

您可以使用 remote_ikernel 命令行功能列出(remote_ikernel manage --show)或删除(remote_ikernel manage --delete <REMOTE_KERNEL_NAME>)远程内核连接。

VS Code - 远程机器(点击展开...)

Visual Studio Code 的 Remote - SSH 扩展允许您打开任何可通过 SSH 访问的远程机器上的远程文件夹,并像处理本地文件夹一样进行操作。连接到远程机器后,您可以与远程文件系统中的任何文件和文件夹交互,并充分利用 VS Code 的各项功能(IntelliSense、调试和支持扩展)。该扩展能够自动发现并开箱即用支持由工作区 SSH 设置脚本配置的无密码 SSH 连接。要使您的本地 VS Code 应用程序连接到工作区:

  1. 在本地 VS Code 中安装 Remote - SSH 扩展。
  2. 按照 SSH 访问 部分的说明运行所选工作区的 SSH 设置脚本。
  3. 打开本地 VS Code 中的 Remote-SSH 面板。所有已配置的 SSH 连接都应自动被发现。只需选择您想要连接的任意已配置的工作区连接,如下所示:

📖 有关 Remote SSH 扩展的更多功能和信息,请参阅此指南

TensorBoard

TensorBoard 提供了一套可视化工具,可帮助您更轻松地理解、调试和优化实验过程。它包含标量、直方图、模型结构、嵌入以及文本和图像可视化的日志记录功能。工作区预装了 jupyter_tensorboard 扩展,可将 TensorBoard 集成到 Jupyter 界面中,并提供启动、管理和停止实例的功能。您可以为有效的日志目录打开一个新的实例,如下所示:

如果您已在有效的日志目录中打开了 TensorBoard 实例,您将看到已记录数据的可视化效果:

除了 TensorFlow 之外,TensorBoard 还可以与其他许多机器学习框架结合使用。通过使用 tensorboardX 库,您可以从几乎任何基于 Python 的库中进行日志记录。此外,PyTorch 也有直接的 TensorBoard 集成,详情请参阅此处

如果您希望直接在笔记本中查看 TensorBoard,可以使用以下 Jupyter magic 命令:

%load_ext tensorboard
%tensorboard --logdir /workspace/path/to/logs

硬件监控

工作区提供了两个预装的基于 Web 的工具,可在模型训练和其他实验任务中帮助开发者深入了解系统中发生的一切,并找出性能瓶颈。

Netdata(“打开工具 -> Netdata”)是一个实时硬件和性能监控仪表板,可可视化 Linux 系统上的进程和服务。它会监控 CPU、GPU、内存、磁盘、网络、进程等指标。

Glances(“打开工具 -> Glances”)也是一个基于 Web 的硬件监控仪表板,可用作 Netdata 的替代方案。

Netdata 和 Glances 将显示工作区容器正在运行的整台机器的硬件统计信息。

作为作业运行

作业被定义为任何在一定时间内运行直至完成的计算任务,例如模型训练或数据流水线。

工作区镜像还可以用于执行任意 Python 代码,而无需启动任何预装工具。这为将您的机器学习项目产品化提供了一种无缝的方式,因为在工作区内交互式开发的代码,在通过同一工作区镜像作为作业运行时,将具有相同的环境和配置。

通过工作区镜像将 Python 代码作为作业运行(点击展开...)

要将 Python 代码作为作业运行,您需要通过 EXECUTE_CODE 提供一个代码目录(或脚本)的路径或 URL。该代码可以已经挂载到工作区容器中,也可以从版本控制系统(例如 git 或 svn)下载,具体方法如下文所述。所选代码路径必须是可执行的 Python 文件。如果所选代码是一个目录(例如从 VCS 下载代码时),则需要在该目录的根目录下放置一个 __main__.py 文件。__main__.py 文件应包含启动作业的代码。

从版本控制系统运行代码

您可以使用 pip-vcs 格式直接从 Git、Mercurial、Subversion 或 Bazaar 执行代码,如 此指南 中所述。例如,要从一个 git 仓库的子目录执行代码,只需运行:

docker run --env EXECUTE_CODE="git+https://github.com/ml-tooling/ml-workspace.git#subdirectory=resources/tests/ml-job" mltooling/ml-workspace:0.13.2

📖 有关如何指定分支、提交或标签的更多信息,请参阅 此指南

运行挂载到工作区的代码

在下面的示例中,我们将当前工作目录(预计包含我们的代码)挂载到工作区的 /workspace/ml-job/ 目录中并执行:

docker run -v "${PWD}:/workspace/ml-job/" --env EXECUTE_CODE="/workspace/ml-job/" mltooling/ml-workspace:0.13.2

安装依赖项

如果预装的工作区库与您的代码不兼容,可以通过将以下一个或多个文件添加到您的代码目录来安装或更改依赖项:

  • requirements.txt: pip 要求格式用于 pip 可安装的依赖项。
  • environment.yml: conda 环境文件用于创建独立的 Python 环境。
  • setup.sh: 通过 /bin/bash 执行的 Shell 脚本。

执行顺序为:1. environment.yml -> 2. setup.sh -> 3. requirements.txt

在交互模式下测试作业

您可以在工作区中(以正常方式启动并带有交互式工具)测试您的作业代码,方法是执行以下 Python 脚本:

python /resources/scripts/execute_code.py /path/to/your/job

构建自定义作业镜像

您也可以将代码直接嵌入到自定义作业镜像中,如下所示:

FROM mltooling/ml-workspace:0.13.2

# 将作业代码添加到镜像
COPY ml-job /workspace/ml-job
ENV EXECUTE_CODE=/workspace/ml-job

# 仅安装依赖项
RUN python /resources/scripts/execute_code.py --requirements-only

# 在容器启动时仅执行代码
CMD ["python", "/resources/docker-entrypoint.py", "--code-only"]

预装库和解释器

工作区预装了许多流行的解释器、数据科学库以及 Ubuntu 软件包:

  • 解释器: Python 3.8 (Miniconda 3)、NodeJS 14、Scala、Perl 5
  • Python 库: Tensorflow、Keras、Pytorch、Sklearn、XGBoost、MXNet、Theano,以及更多
  • 包管理器: condapipapt-getnpmyarnsdkpoetrygdebi...

已安装工具的完整列表可在 Dockerfile 中找到。

对于每个次要版本发布,我们都会使用 safetyclamavtrivy 以及 snyk via docker scan 在工作区内进行漏洞、病毒和安全检查,以确保工作区环境尽可能安全。我们致力于修复和预防所有高危或严重级别的漏洞。您可以在 这里 查看一些最新的报告。

可扩展性

工作区具有高度的可扩展性。在工作区内,您拥有完整的 root 和 sudo 权限,可以通过终端安装所需的任何库或工具(例如 pipapt-getcondanpm)。您可以通过以下方式打开终端:

  • Jupyter: New -> Terminal
  • Desktop VNC: Applications -> Terminal Emulator
  • JupyterLab: File -> New -> Terminal
  • VS Code: Terminal -> New Terminal

此外,预装的工具,如 Jupyter、JupyterLab 和 Visual Studio Code,各自都提供了丰富的扩展生态系统。工作区还包含一个安装脚本集合,用于许多常用开发工具或库(例如 PyCharmZeppelinRStudioStarspace)。您可以通过 Open Tool -> Install Tool 查找并执行所有工具的安装程序。这些脚本也可以从 Desktop VNC 执行(双击 Desktop VNC 桌面上 Tools 文件夹中的脚本)。

示例(点击展开...)

例如,要安装 Apache Zeppelin 笔记本服务器,只需执行:

/resources/tools/zeppelin.sh --port=1234

安装完成后,刷新 Jupyter 网站,Zeppelin 工具将出现在 Open Tool -> Zeppelin 下。其他工具可能仅在 Desktop VNC 中可用(例如 atompycharm),或者根本不提供 UI(例如 starspacedocker-client)。

除了在运行时扩展工作区之外,您还可以按照 FAQ 部分的说明自定义工作区 Docker 镜像,以创建您自己的版本。



常见问题解答

如何自定义工作空间镜像(创建自己的版本)?(点击展开...)

工作空间在运行时可以通过多种方式扩展,具体说明请参见此处。然而,如果您希望使用自己的软件或配置来定制工作空间镜像,可以按照以下示例通过 Dockerfile 实现:

# 从任意一个工作空间版本/风味继承
FROM mltooling/ml-workspace:0.13.2

# 执行自定义操作,例如:
RUN \
    # 使用提供的安装脚本安装 r-runtime、r-kernel 和 r-studio Web 服务器
    /bin/bash $RESOURCES_PATH/tools/r-runtime.sh --install && \
    /bin/bash $RESOURCES_PATH/tools/r-studio-server.sh --install && \
    # 清理层 - 移除不必要的缓存文件
    clean-layer.sh

最后,使用 docker build 构建您自定义的 Docker 镜像。

📖 如需更全面的 Dockerfile 示例,请参阅 R 版本的 Dockerfile

如何更新正在运行的工作空间容器?(点击展开...)

要将正在运行的工作空间实例更新到最新版本,需要将当前的 Docker 容器替换为基于更新后工作空间镜像的新容器。

在此更新过程中,工作空间内未挂载卷持久化的所有数据都将丢失。正如 持久化数据 部分所述,通常会将卷挂载到 /workspace 文件夹。工作空间内的所有工具都配置为将 /workspace 文件夹作为所有源代码和数据工件的根目录。在更新期间,其他目录中的数据将被移除,包括已安装或更新的库以及某些机器配置。我们集成了备份与恢复功能(CONFIG_BACKUP_ENABLED),用于备份和恢复一些选定的配置文件/文件夹,例如用户的 Jupyter/VS-Code 配置、~/.gitconfig~/.ssh

更新示例(点击展开...)

如果工作空间是通过 Docker 部署的(Kubernetes 的更新流程有所不同),则需要先删除现有容器(使用 docker rm),然后使用更新后的工作空间镜像启动新容器(使用 docker run)。请确保使用相同的配置、卷、名称和端口。例如,某个工作空间(镜像版本为 0.8.7)最初是通过以下命令启动的:

docker run -d \
    -p 8080:8080 \
    --name "ml-workspace" \
    -v "/path/on/host:/workspace" \
    --env AUTHENTICATE_VIA_JUPYTER="mytoken" \
    --restart always \
    mltooling/ml-workspace:0.8.7

现在需要将其更新至版本 0.9.1,则需执行以下步骤:

  1. 停止并移除正在运行的工作空间容器:docker stop "ml-workspace" && docker rm "ml-workspace"
  2. 使用更新后的镜像和相同配置启动新的工作空间容器:docker run -d -p 8080:8080 --name "ml-workspace" -v "/path/on/host:/workspace" --env AUTHENTICATE_VIA_JUPYTER="mytoken" --restart always mltooling/ml-workspace:0.9.1
如何配置 VNC 服务器?(点击展开...)

如果您希望通过 VNC 客户端直接连接到工作空间(而不是使用 noVNC Web 应用程序),可能需要更改某些 VNC 服务器配置。要配置 VNC 服务器,可以在容器启动时通过 docker run--env 选项提供或覆盖以下环境变量:

变量 描述 默认值
VNC_PW VNC 连接的密码。只有当 VNC 服务器直接暴露在外时,此密码才需要足够安全。如果通过 noVNC 使用,则其安全性已由配置的身份验证机制保障。 vncpassword
VNC_RESOLUTION VNC 连接的默认桌面分辨率。使用 noVNC 时,分辨率会根据窗口大小动态调整。 1600x900
VNC_COL_DEPTH VNC 连接的默认颜色深度。 24
如何在工作空间中使用非 root 用户?(点击展开...)

很遗憾,目前我们尚不支持在工作空间中使用非 root 用户。我们计划实现这一功能,并已开始进行一些重构以支持该配置。然而,这仍需要我们投入大量额外的工作、重构和测试。

通常不建议在容器中使用 root 用户(或具有 sudo 权限的用户),因为一旦系统或内核出现漏洞,用户可能会突破容器限制并访问宿主机系统。尽管此类严重的内核漏洞并不常见,因此发生严重攻击的风险极低。正如 Docker 官方文档 所述,即使使用 root 用户,容器通常也能很好地防止突破到宿主机。而且与其他许多容器应用场景相比,我们实际上希望为用户提供灵活性,使其能够在工作空间容器内拥有控制权和系统级安装权限。

如何创建和使用虚拟环境?(点击展开...)

工作空间预装了多种常用的工具,可用于创建隔离的 Python 虚拟环境。以下部分将简要介绍如何在工作空间中使用这些工具。关于何时使用哪种工具的信息,请参阅 此处。更多使用信息请参考相应工具的官方文档。

venv(推荐):

要通过 venv 创建虚拟环境,请执行以下命令:

# 在工作目录中创建环境
python -m venv my-venv
# 在 shell 中激活环境
source ./my-venv/bin/activate
# 可选:为该环境创建 Jupyter 内核
pip install ipykernel
python -m ipykernel install --user --name=my-venv --display-name="my-venv ($(python --version))"
# 可选:退出环境会话
deactivate

pipenv(推荐):

要通过 pipenv 创建虚拟环境,请执行以下命令:

# 在工作目录中创建环境
pipenv install
# 在 shell 中激活环境会话
pipenv shell

# 可选:为该环境创建 Jupyter 内核
pipenv install ipykernel
python -m ipykernel install --user --name=my-pipenv --display-name="my-pipenv ($(python --version))"
# 可选:关闭环境会话
exit

virtualenv:

要通过 virtualenv 创建虚拟环境,请执行以下命令:

# 在工作目录中创建环境
virtualenv my-virtualenv
# 在 shell 中激活环境会话
source ./my-virtualenv/bin/activate
# 可选:为该环境创建 Jupyter 内核
pip install ipykernel
python -m ipykernel install --user --name=my-virtualenv --display-name="my-virtualenv ($(python --version))"
# 可选:关闭环境会话
deactivate

conda:

要通过 conda 创建虚拟环境,请执行以下命令:

# 创建环境(全局)
conda create -n my-conda-env
# 在 shell 中激活环境会话
conda activate my-conda-env
# 可选:为该环境创建 Jupyter 内核
python -m ipykernel install --user --name=my-conda-env --display-name="my-conda-env ($(python --version))"
# 可选:关闭环境会话
conda deactivate

提示:Jupyter 笔记本中的 Shell 命令:

如果您通过专用的 Jupyter 内核安装并使用虚拟环境,并在 Jupyter 中使用 shell 命令(例如 !pip install matplotlib),则可能会使用错误的 Python 或 pip 版本。要使用所选内核的 Python 和 pip 版本,请改用以下方法:

import sys
!{sys.executable} -m pip install matplotlib
如何安装不同的 Python 版本?(点击展开...)

工作区提供了三种简便的方法来在主 Python 实例之外安装不同的 Python 版本:pyenvpipenv(推荐)、conda

pipenv(推荐):

要在工作区内通过 pipenv 安装不同的 Python 版本(例如 3.7.8),请执行以下命令:

# 安装指定版本的 Python
pipenv install --python=3.7.8
# 在 shell 中激活环境会话
pipenv shell
# 检查 Python 安装情况
python --version
# 可选:为该环境创建 Jupyter 内核
pipenv install ipykernel
python -m ipykernel install --user --name=my-pipenv --display-name="my-pipenv ($(python --version))"
# 可选:关闭环境会话
exit

pyenv

要在工作区内通过 pyenv 安装不同的 Python 版本(例如 3.7.8),请执行以下命令:

# 安装指定版本的 Python
pyenv install 3.7.8
# 使其全局可用
pyenv global 3.7.8
# 在 shell 中激活该版本的 Python
pyenv shell 3.7.8
# 检查 Python 安装情况
python3.7 --version
# 可选:为该 Python 版本创建 Jupyter 内核
python3.7 -m pip install ipykernel
python3.7 -m ipykernel install --user --name=my-pyenv-3.7.8 --display-name="my-pyenv (Python 3.7.8)"

conda

要在工作区内通过 conda 安装不同的 Python 版本(例如 3.7.8),请执行以下命令:

# 创建包含指定 Python 版本的环境
conda create -n my-conda-3.7 python=3.7.8
# 在 shell 中激活环境会话
conda activate my-conda-3.7
# 检查 Python 安装情况
python --version
# 可选:为该 Python 版本创建 Jupyter 内核
pip install ipykernel
python -m ipykernel install --user --name=my-conda-3.7 --display-name="my-conda ($(python --version))"
# 可选:关闭环境会话
conda deactivate

提示:Jupyter 笔记本中的 Shell 命令:

如果您通过专用的 Jupyter 内核安装并使用其他 Python 版本,同时在 Jupyter 中使用 shell 命令(例如 !pip install matplotlib),则可能会使用错误的 Python 或 pip 版本。要使用所选内核的 Python 和 pip 版本,请改用以下方法:

import sys
!{sys.executable} -m pip install matplotlib
我能否发布除默认端口之外的其他端口来访问容器内的工具?(点击展开...) 您可以这样做,但请注意,此时该端口将不受工作区身份验证机制的保护!出于安全考虑,我们强烈建议您使用工作区的访问端口功能。
系统和工具翻译(点击展开...) 如果您希望在工作区中配置除英语之外的其他语言,而某些工具未正确翻译,请查看此问题。尝试注释掉 `/etc/dpkg/dpkg.cfg.d/excludes` 文件中的“排除翻译”行,然后重新安装或配置相关软件包。


已知问题

共享内存过小可能导致工具或脚本崩溃(点击展开...)

某些桌面工具(例如,最新版本的 Firefox)或库(例如,PyTorch - 参见问题:12)在共享内存大小(/dev/shm)过小时可能会崩溃。Docker 的默认共享内存大小为 64MB,这可能对一些工具来说不够。您可以通过 shm-size docker run 选项提供更大的共享内存大小:

docker run --shm-size=2G mltooling/ml-workspace:0.13.2
多进程代码运行速度异常缓慢(点击展开...)

一般来说,在 Docker 中运行代码的性能与直接在主机上运行几乎相同。然而,如果您限制了容器的 CPU 配额(如 此部分 所述),容器仍然会看到主机上可用的全部 CPU 核心数,且没有技术手段可以阻止这一点。许多库和工具会使用全部 CPU 核心数(例如通过 os.cpu_count())来设置用于多进程或多线程处理的线程数。这可能导致程序启动的线程或进程数量超过其在现有 CPU 配额下能够高效处理的能力,从而极大地降低整体性能。因此,重要的是将可用的 CPU 数量或最大线程数显式地设置为配置的 CPU 配额。该工作空间提供了自动检测可用 CPU 数量的功能,并通过环境变量(如 OMP_NUM_THREADSMKL_NUM_THREADS)来配置各种常用库。此外,也可以在容器启动时通过 MAX_NUM_THREADS 环境变量显式设置可用 CPU 数量(参见 配置部分)。同一环境变量也可用于在运行时获取可用 CPU 数量。

尽管工作空间的自动配置功能可以解决多种效率低下的问题,我们仍建议为所有库显式配置可用的 CPU 数量。例如:

import os
MAX_NUM_THREADS = int(os.getenv("MAX_NUM_THREADS"))

# 在 PyTorch 中设置
import torch
torch.set_num_threads(MAX_NUM_THREADS)

# 在 TensorFlow 中设置
import tensorflow as tf
config = tf.ConfigProto(
    device_count={"CPU": MAX_NUM_THREADS},
    inter_op_parallelism_threads=MAX_NUM_THREADS,
    intra_op_parallelism_threads=MAX_NUM_THREADS,
)
tf_session = tf.Session(config=config)

# 为 Keras 设置会话
import keras.backend as K
K.set_session(tf_session)

# 在 sklearn 的估计器中设置
from sklearn.linear_model import LogisticRegression
LogisticRegression(n_jobs=MAX_NUM_THREADS).fit(X, y)

# 为 multiprocessing 池设置
from multiprocessing import Pool

with Pool(MAX_NUM_THREADS) as pool:
    results = pool.map(lst)
Nginx 因 SIGILL 错误而终止并生成核心转储文件(点击展开...)

如果您在启动工作空间时,容器日志中出现以下错误,则很可能无法在您的硬件上运行该工作空间:

exited: nginx (terminated by SIGILL (core dumped); not expected)

工作空间中使用的 OpenResty/Nginx 二进制包需要在支持 SSE4.2 的 CPU 上运行(参见 此问题)。不幸的是,一些较旧的 CPU 不支持 SSE4.2,因此无法运行该工作空间容器。在 Linux 系统中,您可以通过查看 /proc/cpuinfo 文件中的 flags 部分来确认您的 CPU 是否支持 SSE4.2。如果遇到此类问题,请随时通过评论告知我们:#30



贡献

开发

要求:要执行构建流程,您的机器上必须安装 DockerAct

为了简化从头开始构建该项目的过程,我们基于 universal-build 提供了构建脚本,这些脚本会在容器化环境中运行所有必要的步骤(构建、测试和发布)。要构建并测试您的更改,请在项目根目录下执行以下命令:

act -b -j build

其底层使用了本仓库中基于 universal-build 库 的 build.py 文件。因此,如果您想在本地构建,也可以在项目根目录下执行以下命令来构建 Docker 容器:

python build.py --make

如需更多脚本选项:

python build.py --help

有关我们的构建脚本和开发流程的更详细信息,请参阅我们的 贡献指南


采用 Apache 2.0 许可证。由柏林的开发者用 ❤️ 维护。

版本历史

v0.13.22021/07/13
v0.12.12021/01/11
v0.11.02020/12/13
v0.10.42020/12/13

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|昨天
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|2天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

143.9k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.9k|★★☆☆☆|昨天
开发框架图像Agent

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|昨天
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|昨天
语言模型图像Agent