Skip to content

部署标注服务器

根据研究持续多久、由谁付费、手头有哪些服务器为标注研究选择主机,再用 potato deploy 完成 HTTPS、备份和数据取回。

用于正式研究的标注服务器需要一个公开的 HTTPS 地址、只放你的标注者进来的登录方式、重启后不会丢失的存储,以及研究结束时取回标注的办法。在 Potato 中,potato deploy up 会根据你试运行过的配置创建主机和证书,在会清空磁盘的主机上设置备份,并在任何拿到链接的人都能登录时,于部署之前发出警告。

这里说的标注服务器,是标注者在浏览器中打开的 Web 应用。它运行在你的笔记本电脑以外的地方,这样在研究持续的几周里标注者都能访问。把试运行过的任务搬到这样的服务器上,会改变它的地址、登录方式、数据存放的位置,以及由谁来照看这台机器。

研究服务器的四项要求

下面每项要求保护的不是标注者,就是数据:

  • 公开的 HTTPS 地址。 标注者要在任务中输入密码和标签,所以连接必须用 HTTPS 加密。Let's Encrypt 的证书免费,但服务器需要一个公开地址才能获取。
  • 只放你的标注者进来的登录方式。 公开地址是可以被找到的,开放注册的任务会接受任何找到它的人。请使用实名账号名单(密码管理)、通过 Google、GitHub 或你所在机构登录(SSO 与 OAuth 认证),如果是众包研究,则使用平台发给工作者的链接(众包集成)。
  • 重启后不会丢失的存储。 有些主机每次重启服务器都会清空磁盘。在这类主机上做研究,需要一份能自动恢复的备份,否则回来的标注者会看到一个空白的任务。
  • 取回数据的办法。 Potato 把每位标注者的工作存放在文件中,把项目数据保存在 SQLite 数据库里。服务器运行时直接复制 SQLite 文件可能会漏掉最近的工作,所以取回数据时必须使用 SQLite 自带的备份命令。

常见研究情形对应的主机

哪种主机合适,取决于研究持续多久、由谁付费,以及你所在机构是否已经在运行服务器。下表把常见情形对应到主机,并列出 Potato 为每个目标的默认规格打印的每月费用:

情形主机每月费用指南
一项研究,已有 AWS 账号AWS Lightsail,2 GB$12AWS Lightsail
美国机构的一项研究,没有预算Jetstream2有 ACCESS 分配额度时免费Jetstream2
一项研究,价格最低Hetzner Cloud,4 GB约 €6Hetzner、Vultr 和 Linode
公开演示,或已经在用 Hugging Face 的实验室Hugging Face Docker SpacePRO 或 Team 方案Hugging Face Spaces
和几个人做一个下午的试点你的笔记本电脑,通过 potato share免费在本地或云端运行 Potato
你所在机构已经在运行的服务器放在反向代理后面的 Docker 镜像Potato 本身不产生费用生产部署

前三种是磁盘在重启后保留的虚拟机,所以是持续数周的研究的默认选择。Hugging Face Space 每次重启都会丢失磁盘,因此 Potato 每五分钟把标注备份到一个私有的 Hugging Face 数据集,并在 Space 启动时恢复。在本地或云端运行 Potato 列出了全部十三个云端目标,包括 Fly、Railway、Render 和 Heroku。

在新主机上使用 potato deploy

potato deploy up 接过你试运行过的配置,完成原本需要人手动去做的事。在虚拟机上,它会创建机器,只开放 22、80 和 443 端口,安装 Docker 和 Caddy Web 服务器,获取 Let's Encrypt 证书,上传项目,并把 Potato 作为服务启动。先安装你的主机对应的 pip extra,也就是部署到该主机所需的可选依赖,然后按主机读取的方式检查配置:

bash
pip install 'potato-annotation[deploy-aws]'
potato deploy check myproject/config.yaml --provider aws
potato deploy up myproject/config.yaml --provider aws --dry-run

potato deploy check 会报告配置错误,并找出只能在你的机器上解析的路径。--dry-run 不需要云账号,会打印这次部署将要创建的每一项资源、每月费用,以及谁能够登录。如果公开地址上开放了注册,它会用警告 D003 标出来。要部署时,去掉 --dry-run 运行同一条命令。Potato 会再次显示计划,在你确认之前不创建任何东西,然后打印要发给标注者的 URL。

部署只改动与托管有关的设置。它会关闭调试模式,让会话在重启后保留,并且只运行一个 worker 进程,因为 Potato 把项目池和分配队列放在内存里,第二个进程会把同样的项目分发两次。user_config、authentication 和 require_password 则保持你写的样子。它会为这次部署生成一个管理员密钥,存放在配置旁边的 .potato/secrets.json 中,用这个密钥可以打开 /admin 上的管理仪表板。

在你所在机构已经运行的服务器上部署 Potato

如果你所在机构已经在运行服务器,就把官方发布的 Docker 镜像放在它的反向代理后面运行,而不必新建主机。nginx 之类的反向代理持有证书,并把请求转发给 Potato。生产部署提供了 Docker Compose 文件、nginx 配置和 gunicorn 设置。gunicorn 请保持一个 worker,用增加线程来提高并发,因为第二个 worker 进程会把同样的项目分发两次。

Potato 的 backup 块会在那台服务器之外保留一份数据副本。它默认每五分钟把标注输出和项目数据库的快照复制到一个 Hugging Face 数据集或兼容 S3 的存储桶,并在服务器以空磁盘启动时恢复。把下面这个块加到配置里,安装 hosting extra,并在服务器环境中设置 HF_TOKEN:

yaml
backup:
  schedule_minutes: 5
  restore_on_boot: true
  sinks:
    - type: huggingface
      repo_id: lab/pilot-annotations

如果数据集不存在,Potato 会把它创建为私有仓库。恢复时账号列表会和标注一起恢复,所以标注者用原来的密码登录;恢复也从不覆盖磁盘上已有的标注。

状态检查与数据取回

potato deploy status 报告服务器是否在运行、证书是否正常。在没有域名的虚拟机上,证书是为 IP 地址签发的,有效期约六天。它会自动续期,所以如果研究在无人看管的情况下运行,请每隔几天检查一次状态,或者传入 --domain 并配好指向服务器的 DNS 记录。potato deploy logs myproject/config.yaml -f 会持续输出服务器日志,管理仪表板则在标注者工作期间显示进度、吞吐量和标注者间一致性。

研究结束时,先拉取数据,再删除主机:

bash
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yaml

pull 把标注输出和项目数据库复制到一个新的 potato-pull-<name>-<timestamp> 目录,并检查收到了什么。destroy 不会删除从未拉取过的部署,没有拉回任何文件的拉取也不算数,所以在销毁任何东西之前,请打开拉取下来的目录,确认最后的标注都在里面。

延伸阅读