自托管标注工具:各自需要什么才能运行,以及部署在哪里
从服务、数据库、登录和备份方面比较 Label Studio、CVAT、doccano、Argilla、INCEpTION 和 Potato 的自托管安装,并按成本比较托管平台。
自托管的标注工具需要它所在的服务器提供四样东西:一块重启后数据仍在的磁盘,一个工具自身文档推荐用于生产环境的数据库,一种让标注者登录的方式,以及一份你至少成功恢复过一次的备份。各个开源工具差别最大的地方,在于它们自带多少个服务,从一个容器到十八个不等,而这个数字决定了一项研究要承担的大部分托管工作。
这里的自托管,是指在你自己掌控的机器上运行标注工具,可以是实验室服务器、大学的云资源配额,也可以是租用的虚拟机,这样数据就永远不会经过厂商的服务。当伦理委员会、数据使用协议或医院不允许数据外流时,自托管通常就是答案。下面的比较依据各项目截至 2026 年 10 月的文档,介绍六款开源工具的自托管安装各需要什么,然后按成本和重启后保留什么来比较各托管平台。
自托管安装的要求
下面每款工具都存储三类状态:待标注的条目(例如文本、图像、媒体)、标注结果,以及把两者联系起来的账号和项目。自托管安装必须把这三类状态都放在重启后仍在的磁盘上,在别处做好备份,并在前面加上登录。另有两个选择取决于工具的架构。自带 SQLite 的工具通常推荐在生产环境中使用数据库服务器,而自带队列、缓存或搜索引擎的工具,还需要让这些组件各自运行并持久化。大部分托管工作都来自这些额外的服务。每多一个服务,就多一个要保持健康的容器、多一个要备份的卷,而且每次升级时,它的版本都必须与其他服务保持兼容。
六款工具的比较
下表汇总了各项目文档对自托管生产安装的说明。“服务数”统计的是项目参考 Docker Compose 文件中的容器数量。
| 工具 | 支持的部署形式 | 服务数 | 数据库 | 免费版中的 SSO | 服务器备份指南 |
|---|---|---|---|---|---|
| Label Studio | pip、Docker、Compose、Helm | 3 | 默认 SQLite,规模较大时推荐 PostgreSQL | SAML SSO 和 LDAP 仅限企业版 | 仅企业版文档 |
| CVAT | Compose、Helm | 18 | PostgreSQL | 社区版有 LDAP 文档;OIDC 和 SAML SSO 属于企业版 | 有 |
| doccano | pip、Docker、Compose | 6 | 默认 SQLite,生产用 Compose 中为 PostgreSQL | GitHub 和 Okta OAuth | 未找到 |
| Argilla | Hugging Face Spaces、Compose | 5 | 默认 SQLite,支持 PostgreSQL,另需 Elasticsearch 或 OpenSearch | OAuth2 和 Keycloak | 仅数据集导出 |
| INCEpTION | JAR、Docker、Compose | 2 | 内嵌 HSQLDB,生产环境推荐 MariaDB | SAML2 和 OIDC | 有 |
| Potato | pip、Docker、potato deploy | 1 | 文件和 SQLite,MySQL 可选 | OAuth 和 OIDC 提供方 | 内置备份到 HF 或 S3 |
Label Studio 可以作为单个容器运行,也可以作为由 nginx、应用本身和 PostgreSQL 组成的 Compose 栈运行。它默认使用 SQLite,其存储指南建议在任务超过 10 万个、并发用户达到 5 个或以上时考虑 PostgreSQL。安装指南要求至少 8 GB 内存,推荐 16 GB,并推荐生产环境使用 50 GB 磁盘。版本对比把 SAML SSO、LDAP、基于角色的访问控制和活动日志列为付费功能,而在社区版中,每个用户都能看到每个项目。
CVAT 以 Docker Compose 或在 Kubernetes 上运行。它的参考 Compose 文件定义了 18 个服务,其中包括 PostgreSQL、Redis、用于缓存的 kvrocks、八个后台 worker、Traefik、一个用于授权的 Open Policy Agent 服务,以及一套 ClickHouse 加 Grafana 的分析栈。CVAT 逐步记录了备份方法。它的指南会停止容器,归档数据库、媒体和分析数据卷,并提醒恢复时需要完全相同的 CVAT 版本。社区版有 LDAP 的文档,而 OIDC 和 SAML 单点登录被标注为企业版功能。
doccano 一开始是一个使用 SQLite 的容器,它的生产用 Compose 文件又加入了 Celery、RabbitMQ、nginx 和 PostgreSQL。它的安装指南提醒,升级软件包会丢失 SQLite 数据库。它有 GitHub 和 Okta 登录的文档。截至 2026 年 10 月,它在 PyPI 上的最新版本是 2023 年 7 月发布的 1.8.4;2026 年 1 月在 GitHub 上发布的 1.8.5 已从 PyPI 撤回。
Argilla 部署在 Hugging Face Spaces 上,或者用 Docker Compose 部署,后者会让服务器、一个 worker、PostgreSQL、Elasticsearch 和 Redis 一起运行。它需要 Elasticsearch 8.5 或 OpenSearch 2.4,部署指南指出,大多数部署问题都与 Elasticsearch 有关。在没有持久存储的免费 Space 上,一次重启就会丢失数据集、工作区和用户。它最近的一个版本发布于 2025 年 3 月。
INCEpTION 以 Java 应用或容器运行,生产环境推荐使用 MariaDB 数据库,因为它内嵌的 HSQLDB 在机器崩溃时可能损坏。标注和文本以文件形式保存在它的主目录下,管理员指南完整介绍了系统级的备份和恢复,其备份一节开头就警告:“无法成功恢复的备份毫无价值”。
Potato 以单个进程运行,可以通过 pip 安装,也可以用单个 Docker 镜像。每位标注者的工作都存储在输出目录下的一个文件中,项目数据则存放在旁边的 SQLite 里,MySQL 是可选项而不是必需项。这个进程在内存中保存条目池和分配队列,所以它以一个 gunicorn worker 加更多线程的方式运行,要扩容就换一台更大的机器,而不是增加服务器。通过 Google、GitHub、Hugging Face 或任何 OIDC 提供方登录,是开源软件包的一部分,在 authentication.providers 下配置。
每款工具的服务数反映了它所承担的工作。CVAT 的十八个服务包括分别负责导入、导出、分块和质量报告的 worker、一套分析栈和基于策略的授权,一个长期运行同一套安装的大团队用得上这些。Argilla 的数据集需要一个搜索引擎。Potato 保持只用一个容器,适合由一个实验室搭建、运行几周后就拆掉的研究。
按成本和磁盘持久性比较托管平台
这些工具都能在装有 Docker 的虚拟机上运行,主要的选择在于托管平台的磁盘能否在重启后保留。下面的费用是 Potato 2.10 为其 potato deploy 目标在默认规格下打印的估算,同样的机器以同样的价格也能运行其他工具,前提是满足各工具的内存需求。
| 托管平台 | 每月费用 | 重启后磁盘是否保留 |
|---|---|---|
| AWS Lightsail,2 GB | $12 | 是 |
| Hetzner Cloud,2 vCPU 和 4 GB | 约 €6 | 是 |
| Fly.io Machine,带 1 GB 卷 | 约 $6 | 是 |
| Jetstream2,需 ACCESS 资源配额 | 免费 | 是 |
| Render web service | 免费,或 $7 外加磁盘费用 | 仅限付费磁盘 |
| Heroku Basic dyno | $7 | 否 |
| Hugging Face Docker Space | PRO 或 Team 套餐 | 否 |
Jetstream2 是由 NSF 资助的科研云,所以拥有 ACCESS 资源配额的美国研究人员无需付费,每个实例都会得到一个 DNS 名称和一张普通证书。Lightsail 的固定价格包含 IPv4 地址和 60 GB 磁盘,而且只需要 lightsail:* 和 sts:GetCallerIdentity 权限,适合权限受限的大学 IAM 角色。2 GB 的 Lightsail 实例足以运行 Potato,而 Label Studio 声明的 8 GB 最低内存则需要更大的套餐。
在会清空磁盘的平台上备份
Heroku 每天都会清空磁盘,Render 的免费层和 Hugging Face Spaces 则在重启时丢失磁盘。在这些平台上运行的研究需要一份同样能恢复的备份,否则回来的标注者会看到一个空的任务。
从 2.10 版起,Potato 的 backup 配置块默认每五分钟把标注输出和项目数据库的快照复制到一个 Hugging Face 数据集或兼容 S3 的存储桶中,并在服务器以空磁盘启动时恢复它们。恢复时会把账号和标注一起找回,所以标注者用原来的密码登录,从上次停下的地方继续,而且恢复永远不会覆盖磁盘上已有的标注。在服务器环境中设置好 HF_TOKEN、安装好 hosting 附加依赖后,把下面这个配置块加进配置:
backup:
schedule_minutes: 5
restore_on_boot: true
sinks:
- type: huggingface
repo_id: lab/pilot-annotationspotato deploy up 用 --backup hf 或 --backup s3 添加同样的备份,而且除非用 --demo 声明这些标注可以丢弃,否则它不会在没有备份的情况下部署到 Heroku 或 Hugging Face Space。Render、Railway、Fly 和 ECS Express 在任何情况下都要求有备份,因为项目是通过备份的存储到达这些平台的。在磁盘确实会保留的平台上,备份仍会在服务器之外保留第二份副本,这样既能应对重启,也能应对实例被删除。
无论用哪款工具,都要在研究开始前测试恢复。从备份启动一个全新的实例,以标注者身份登录,检查你做的最后一条标注是否还在。对于 Potato,potato deploy pull 会把一次部署收集到的所有内容复制到你的机器上,而 potato deploy destroy 不会删除一个从未被拉取过的部署,所以在研究结束时先运行拉取。在本地或云端运行 Potato 给出了每个托管平台对应的命令。
延伸阅读
- 生产部署:gunicorn、Docker 和反向代理
- SSO 与 OAuth 认证:配置登录提供方
- 标注工具对比:比较功能而非托管