Ateam Tech Blog

エイチームのエンジニアたちによるテックブログ

Cloudflare Constellationでエッジから機械学習モデルを使う

こんにちは。このテックブログの二代目編集長を拝命しました鈴木です。引き続きよろしくお願いします。

私は普段機械学習の開発をしています。機械学習モデルをアプリケーションに組み込んでサービスとして提供するためには、用意した機械学習モデルをどこで実行するかも考える必要があります。そこで本稿では、Cloudflareが新たに発表した機械学習用のサービスであるCloudflare Constellation を紹介します。

参考: CloudflareスタックにAIをもたらすConstellationの紹介

Constellationは、Cloudflareのエッジアプリケーション基盤であるWorkersの周辺サービスの一部であり、機械学習モデルを実行できるようにするものです。予め用意した機械学習モデルWorkersから呼び出すような形になります。

Constellationは2023年7月現在、プライベートベータとして一部のユーザにのみ有効化されています。本稿の内容は正式リリース時には仕様等が変更される可能性があります。

使い方

具体的な手順は公式ドキュメントに情報があるので省きますが、大きくは以下のような手順に沿って開発します。

  1. Constellationプロジェクトに機械学習モデルをアップロード
  2. 機械学習モデルを動かすスクリプトを記述
  3. Workersへデプロイ

開発にはCloudflareのCLIツールであるWranglerを利用しますが、一部はWeb上のダッシュボード画面からGUI操作でもできると思います。

まずwrangler constellation project createコマンドでConstellationプロジェクトを作成し、wrangler constellation model uploadコマンドで機械学習モデルをConstellationにアップロードします。予めトレーニングしたものや、オープンソースのモデルをアップロードします。モデルはONNXなどConstellationが対応している形式にしておく必要があります。

アップロードしたモデルは、Cloudflareのダッシュボード上でも確認できます。 なお、ひとつのConstellationプロジェクトに複数のモデルを紐付けられます。

次にWorkerを作成し、ConstellationプロジェクトをWorkerにバインドし、アップロードした機械学習モデルを呼び出すスクリプトを記述します。 run()メソッドで先ほどアップロードしたモデルのIDを指定し、入力としてcloudflare/constellationのTensorオブジェクトを渡すと、返り値としてTensorオブジェクトが得られます。

const output = await run(env.PROJECT, modelId, inputTensor);

このrun()メソッドの前後で、モデルに合った形でTensorオブジェクトを変換する前処理・後処理を記述します。公式ドキュメントのサンプルプロジェクトでは画像の分類なので、画像データをTensorに変換したり、出力結果を画像クラスのラベルに変換する処理などが含まれています。自然言語処理アプリケーションであればトークナイザによるエンコード・デコードが必要になります。

最後にwrangler publishでこのWorkerをデプロイすると、実行できるようになります。

Cloudflare Constellationでの開発の注意点

このようにCloudflare上で機械学習を簡単に実行する環境ができるConstellationですが、普段Pythonで機械学習の開発をしている筆者にとって、つまづいた点がいくつかありました。

実行できるランタイムの制限

Constellationで実行できる機械学習ランタイムは特定のものに制限されており、対応したランタイムのモデルを用意する必要があります。発表当初はONNXランタイムのみをサポートしていましたが、後のアップデートで追加されました。サポートされているランタイムの一覧はwrangler constellation runtime listで確認できます。

$ export NO_CONSTELLATION_WARNING=true && npx wrangler constellation runtime list

┌─────────┐
│ name    │
├─────────┤
│ ONNX    │
├─────────┤
│ XGBoost │
└─────────┘

実際には、実行したい機械学習モデルを用意してからONNX等に変換して使うことが多くなるのではないかと思います。

モデルサイズの制限

Constellationにはアップロードできるモデルのサイズに制限があります。発表当初は10MB1でしたが、2023年6月のアップデートで50MBまでに増加しました。

この制限は、たとえば昨今流行している大規模言語モデルを動作させるには厳しいものです。日本語のGPTモデルの中でもサイズの小さいrinna/japanese-gpt2-xsmallであっても150MB程度あるので、現状はConstellationでGPTのモデルを動かすことは難しいと思います。

Workersでの機械学習ライブラリの制限

たとえばPythonでTransformersライブラリを使って開発した機械学習アプリケーションをCloudflare Constellationで動作させるには、PythonのTransformersと互換性のあるJavaScriptのTransformers.jsに頼ることになります。JavaScriptのTransformers.jsは、PythonのTransformersとは動作が異なる所があったりするので、注意しながら開発する必要があります。

また、Cloudflare Workers(Node.js)で動作するTransformers.jsのTensorクラスと、Constellationのrun()メソッドでやり取りするためのconstellationライブラリのTensorクラスも異なる物であり、注意が必要です。たとえば新規のTensorオブジェクトを作成するときの値の渡し方ですが、Transformers.jsでは第2引数に渡しますが、constellationライブラリでは第3引数に渡します。

// Transformers.js (@xenova/transformers)
const tensor = new Tensor("int64", ids, [1, ids.length]);

// Constellations (@cloudflare/constellation)
const tensor = new Tensor("int64", [1, ids.length], ids);

言語やライブラリが異なるのでこういった違いが出るのは当然の話なのですが、それぞれのライブラリの扱いに慣れていないと戸惑うことが多いと思います。

Cloudflare Constellationのパフォーマンス

Cloudflare Workersのようなエッジ上でアプリケーションを動かす長所のひとつはパフォーマンスではないかと思います。実際にConstellationで公式ドキュメントのデモにあるSqueezeNetによる画像分類を何度か実行して測ってみましたが、その実行時間は500msec程度になりました。このモデルはとても小さく、ローカルでも高速に動作します。それを考えると、500msecというのは超高速というわけでもありません。

まとめ

Cloudflare Constellationを使ってみました。 まだベータ版で使いづらい所もありましたが、今後機械学習モデルを動かす選択肢としてエッジが増えるのは夢があると思いました。実行環境を別で用意しなくても、Cloudflareのエコシステム上で機械学習アプリケーションを展開できるのはひとつの長所だと思いました。今後の発展が楽しみです。


  1. Cloudflare公式サイトでは、10MBと10MiBという表記の両方があり、どちらが正確な値かは分かりません。