部署标注服务器
根据研究持续多久、由谁付费、手头有哪些服务器为标注研究选择主机,再用 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 | $12 | AWS Lightsail |
| 美国机构的一项研究,没有预算 | Jetstream2 | 有 ACCESS 分配额度时免费 | Jetstream2 |
| 一项研究,价格最低 | Hetzner Cloud,4 GB | 约 €6 | Hetzner、Vultr 和 Linode |
| 公开演示,或已经在用 Hugging Face 的实验室 | Hugging Face Docker Space | PRO 或 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,也就是部署到该主机所需的可选依赖,然后按主机读取的方式检查配置:
pip install 'potato-annotation[deploy-aws]'
potato deploy check myproject/config.yaml --provider aws
potato deploy up myproject/config.yaml --provider aws --dry-runpotato 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:
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 会持续输出服务器日志,管理仪表板则在标注者工作期间显示进度、吞吐量和标注者间一致性。
研究结束时,先拉取数据,再删除主机:
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yamlpull 把标注输出和项目数据库复制到一个新的 potato-pull-<name>-<timestamp> 目录,并检查收到了什么。destroy 不会删除从未拉取过的部署,没有拉回任何文件的拉取也不算数,所以在销毁任何东西之前,请打开拉取下来的目录,确认最后的标注都在里面。
延伸阅读
- 在本地或云端运行 Potato:所有云端目标和备份选项
- 生产部署:在你自己的服务器上使用 gunicorn、Docker 和 nginx
- 在 Prolific 和 MTurk 上开展研究:把众包工作者引导到已部署的任务
- 导出标注数据用于机器学习:把拉取下来的数据转换成训练文件