Transformers.js を使った ML パワード ウェブゲームの作成
Hugging Face は、Doodle Dash の開発について詳しく説明しています。これはユーザーのブラウザ内で完全に動作するリアルタイムの機械学習 (ML) パワード ウェブゲームです。Transformers.js を活用することで、サーバーのレイテンシが解消され、ユーザーが描画している間にモデルが 1 秒間に 60 回以上の予測を行えるようになります。
モデルのトレーニングとアーキテクチャ
Doodle Dash の核となるのは、Google の "Quick, Draw!" データセットのサブセットで訓練されたスケッチ検出モデルで、これは 345 カテゴリにわたって 500 万枚以上の絵を含んでいます。
モデル選択
開発者は、apple/mobilevit-small(ImageNet-1k で事前学習された軽量な Vision Transformer (ViT))をファインチューニングしました。このモデルは、モバイルフレンドリーなアーキテクチャと小さなフットプリントのため選ばれ、パラメータ数はわずか 560 万、ファイルサイズは約 20 MB であり、ブラウザ内での実行に最適です。
ファインチューニング プロセス
ファインチューニング ワークフローには、以下の技術的手順が含まれています:
- Data Loading: "Quick, Draw!" データセットのサブセットをインポートする。
- Preprocessing:
MobileViTImageProcessorを使用してデータを変換する。 - Configuration: コラテ関数と評価指標を定義する。
- Model Initialization: 事前学習済みの
MobileViTForImageClassificationモデルをロードする。 - Training:
TrainerとTrainingArgumentsヘルパー クラスを利用する。 - Evaluation: 🤗 Evaluate ライブラリを使用してパフォーマンスを検証する。
Transformers.js を使ったブラウザ デプロイ
Transformers.js は、バックエンド サーバーを必要とせずにブラウザ内で直接 🤗 Transformers モデルを実行できる JavaScript ライブラリです。Python ライブラリと機能的に等価な API を提供します。
ONNX へのモデル変換
Transformers.js は実行に ONNX Runtime を使用するため、PyTorch モデルは ONNX 形式に変換する必要があります。これは、Transformers.js リポジトリに提供されている変換スクリプトを使って 🤗 Optimum ライブラリで実現されます:
python -m scripts.convert --model_id <model_id>
技術的実装
計算コストの高い推論プロセスがメイン UI スレッド(レンダリングとユーザー入力を処理)をブロックしないように、ゲームは Web Workers API を実装しています。推論ロジックは別のワーカー スレッド (worker.js) に隔離されており、そこで image-classification パイプラインが初期化され、グレースケール画像が処理されて予測が返されます。
ゲーム設計と最適化
リアルタイム推論ループ
数秒ごとに予測を行う元の "Quick, Draw!" ゲームとは異なり、Doodle Dash はブラウザ内推論の高周波パフォーマンスを活用して、より高速なゲームループを作成します:
- Objective: 60 秒以内に可能な限り多くの落書きを描こうとする。
- Mechanics: 正しい予測があるとすぐにキャンバスがクリアされ、新しい単語が促される。
- Penalty: 単語をスキップすると、残り時間から 3 秒が減算される。
- Score Adjustment: モデルが単にラベルを消去するのを防ぐため、ゲームは最初の
n個の誤ったラベルに対してスコアを減少させ、時間とともにnが増加する。
データセットの改良
モデルサイズが小さい (~20MB) にもかかわらずゲームの品質を維持するため、開発者は元の 345 クラスをフィルタリングしました。ラベルは次の条件に該当する場合に削除されました:
- 他のラベルと類似しすぎている(例: "barn" vs. "house")。
- 理解や詳細な描写が困難すぎる(例: "animal migration" または "brain")。
- あいまいである(例: "bat")。
このフィルタリング プロセスにより、最終的には 300 種類以上の異なるクラスが得られました。