セルフホスト型アノテーションツール:それぞれの実行に必要なものとホスト先
Label Studio、CVAT、doccano、Argilla、INCEpTION、Potatoを、セルフホスト時のサービス構成、データベース、サインイン、バックアップで比較し、ホスト先も費用別に紹介します。
セルフホスト型のアノテーションツールが、それを動かすサーバーに求めるものは4つあります。再起動しても残るディスク、そのツール自身のドキュメントが本番用に推奨するデータベース、アノテーターがサインインする手段、そして少なくとも一度は復元を試したバックアップです。オープンソースのツール間で最も大きく異なるのは、ツールが一緒に持ち込むサービスの数で、1コンテナから18コンテナまで幅があります。研究が引き受けるホスティング作業の大部分は、この数で決まります。
ここでいうセルフホストとは、研究室のサーバー、大学のクラウド割り当て、レンタルのVMなど、自分が管理するマシンでアノテーションツールを動かし、データがベンダーのサービスを一切通らないようにすることです。倫理審査委員会、データ利用契約、病院がデータの外部持ち出しを認めない場合、セルフホストが通常の答えになります。以下の比較では、2026年10月時点の各プロジェクトのドキュメントに基づいて、6つのオープンソースツールをセルフホストする際に何が必要かを取り上げ、続いてホスト先を費用と再起動後に何が残るかで比較します。
セルフホスト環境の要件
以下のどのツールも、3種類の状態を保存します。アノテーション対象の項目(テキスト、画像、メディアなど)、アノテーション、そしてそれらを結び付けるアカウントとプロジェクトです。セルフホスト環境では、この3つすべてを再起動しても残るディスクに保持し、別の場所にバックアップし、その前段にサインインを置く必要があります。さらに、ツールのアーキテクチャから2つの選択が生じます。SQLiteを同梱するツールは、通常、本番用にはデータベースサーバーを推奨します。また、キュー、キャッシュ、検索エンジンを同梱するツールでは、それぞれを稼働させ、永続化する必要もあります。ホスティング作業の大部分は、こうした追加のサービスから生じます。サービスが1つ増えるごとに、正常に保つべきコンテナとバックアップすべきボリュームが1つずつ増え、アップグレードのたびにそのバージョンを他のサービスと互換性のある状態に保たなければなりません。
6つのツールの比較
次の表は、セルフホストの本番環境について各プロジェクトのドキュメントが述べている内容をまとめたものです。「サービス」は、プロジェクトの参照用Docker Composeファイルにあるコンテナの数です。
| ツール | サポートされる形態 | サービス | データベース | 無料版のSSO | サーバーのバックアップガイド |
|---|---|---|---|---|---|
| Label Studio | pip、Docker、Compose、Helm | 3 | デフォルトはSQLite、大規模ではPostgreSQLを推奨 | SAML SSOとLDAPはEnterpriseのみ | Enterpriseのドキュメントのみ |
| CVAT | Compose、Helm | 18 | PostgreSQL | CommunityではLDAPが文書化、OIDCとSAML SSOはEnterprise | あり |
| 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 は、1つのコンテナとして、またはnginx、アプリ本体、PostgreSQLからなるComposeスタックとして動作します。デフォルトではSQLiteを使い、そのストレージガイドでは、タスクが100,000件を超え、同時ユーザーが5人以上になる場合はPostgreSQLを検討するよう述べています。インストールガイドは、RAMを最低8 GB求め、16 GBを推奨し、本番用には50 GBのディスクを推奨しています。エディション比較では、SAML SSO、LDAP、ロールベースのアクセス制御、アクティビティログが有料機能として挙げられており、Community版ではすべてのユーザーがすべてのプロジェクトを見ることができます。
CVAT は、Docker ComposeまたはKubernetes上で動作します。参照用のComposeファイルには18のサービスが定義されており、その中にはPostgreSQL、Redis、キャッシュ用のkvrocks、8つのバックグラウンドワーカー、Traefik、認可用のOpen Policy Agentサービス、ClickHouseとGrafanaによる分析スタックが含まれます。CVATはバックアップを手順ごとに文書化しています。そのガイドではコンテナを停止し、データベース、メディア、分析のボリュームをアーカイブします。また、復元にはまったく同じバージョンのCVATが必要だと注意しています。LDAPはCommunity版向けに文書化されている一方、OIDCとSAMLのシングルサインオンはEnterpriseと記載されています。
doccano は、SQLiteを使う1つのコンテナとして始まり、本番用のComposeファイルではCelery、RabbitMQ、nginx、PostgreSQLが加わります。インストールガイドは、パッケージをアップグレードするとSQLiteのデータベースが失われると警告しています。GitHubとOktaによるサインインが文書化されています。2026年10月時点で、PyPI上の最新リリースは2023年7月の1.8.4で、2026年1月にGitHubで公開された1.8.5はPyPIからyankされています。
Argilla は、Hugging Face SpacesまたはDocker Composeでデプロイします。Docker Composeでは、サーバー、ワーカー、PostgreSQL、Elasticsearch、Redisが一緒に動作します。Elasticsearch 8.5またはOpenSearch 2.4が必要で、デプロイガイドには、デプロイの問題のほとんどはElasticsearchに関わるものだと書かれています。永続ストレージのない無料のSpaceでは、再起動するとデータセット、ワークスペース、ユーザーが失われます。最新のリリースは2025年3月のものです。
INCEpTION は、Javaアプリケーションまたはコンテナとして動作します。組み込みのHSQLDBはマシンがクラッシュすると破損することがあるため、本番用のデータベースとしてはMariaDBが推奨されています。アノテーションとテキストはホームフォルダ以下のファイルに保存され、管理者ガイドはシステムレベルのバックアップと復元を詳しく扱っています。そのバックアップの節は、「正常に復元できないバックアップには価値がない」という警告で始まります。
Potato は、pipまたは単一のDockerイメージから、1つのプロセスとして動作します。各アノテーターの作業は出力ディレクトリ以下のファイルに保存され、プロジェクトのデータはその隣のSQLiteに置かれます。MySQLは必須ではなく選択肢です。プロセスは項目プールと割り当てキューをメモリ上に保持するので、gunicornのワーカー1つと複数のスレッドで動作し、サーバーを追加するのではなく、より大きなマシンに移ることで規模を拡大します。Google、GitHub、Hugging Face、または任意のOIDCプロバイダーによるサインインはオープンソースのパッケージに含まれており、authentication.providers以下で設定します。
各ツールのサービス数は、そのツールが引き受ける仕事を反映しています。CVATの18のサービスには、インポート、エクスポート、チャンク分割、品質レポートのための個別のワーカー、分析スタック、ポリシーベースの認可が含まれており、長期間運用するインストールを持つ大きなチームならこれらを活用できます。Argillaはデータセットのために検索エンジンを必要とします。Potatoは1つのコンテナにとどまり、1つの研究室が立ち上げ、数週間運用し、撤去する研究に合っています。
費用とディスクの永続性で見るホスト先
これらのツールはどれもDockerの入ったVMで動作し、主な選択はホストのディスクが再起動後も残るかどうかです。以下の費用は、Potato 2.10がpotato deployの各ターゲットについてデフォルトのサイズで表示する見積もりです。同じマシンで他のツールも同じ価格で動きますが、各ツールが必要とするメモリ次第です。
| ホスト | 月額費用 | 再起動後もディスクが残る |
|---|---|---|
| AWS Lightsail、2 GB | $12 | はい |
| Hetzner Cloud、2 vCPUと4 GB | 約€6 | はい |
| 1 GBボリューム付きのFly.io Machine | 約$6 | はい |
| Jetstream2(ACCESSの割り当てあり) | 無料 | はい |
| Renderのウェブサービス | 無料、または$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ブロックは、アノテーションの出力とプロジェクトのデータベースのスナップショットを、デフォルトで5分ごとに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では、プロジェクトがバックアップのストレージを経由してこれらのホストに届くため、どのような場合でもバックアップが必要です。ディスクが永続化されるホストでも、バックアップはサーバーの外に2つ目のコピーを保持するので、再起動だけでなくインスタンスの削除にも備えられます。
どのツールでも、研究を始める前に復元を試してください。バックアップから新しいインスタンスを起動し、アノテーターとしてサインインし、最後に付けたアノテーションが残っていることを確認します。Potatoでは、potato deploy pullがデプロイ先で収集したものすべてを手元のマシンにコピーします。potato deploy destroyは一度もpullしていないデプロイを削除しないので、研究の終わりにはまずpullを実行してください。各ホスト向けのコマンドはPotatoをローカルまたはクラウドで実行するにあります。
参考資料
- 本番環境のセットアップ:gunicorn、Docker、リバースプロキシについて
- SSOとOAuth認証:サインインプロバイダーの設定について
- アノテーションツールの比較:ホスティングではなく機能の比較