Cloudflare Workersのエコシステムには現在、コンピューティング、ホスティング、ストレージ、データベース、ストリーミング、ネットワーキング、セキュリティ、その他多くの製品と機能が含まれています。当社はこれまで、従来のソフトウェアアーキテクチャからの移行に踏み切っていただけるよう、グローバルに拡張可能な複雑なアプリケーションを当社のスタック上に構築できることを実証し、文書化してきました。
本日、CloudflareがそのスタックにConstellationを加え、開発者がトレーニング済みの機械学習モデルと推論タスクをCloudflareネットワーク上で実行できるようにすることを大変嬉しく思います。
当社のスーパークラウドに新たな構成要素を追加
最近、機械学習とAIが盛んに取り沙汰されていますが、私たちは何年も前から日常生活でそれらのテクノロジーを使っています。知らずに使っていることもあります。例えば携帯電話、コンピューター、車、ホームアシスタントなどで、それらすべてにAIが使われています。AIは至るところにあるのです。
ただ、開発者にとってAIがコモディティ化しているとはまだ言えません。多くの場合、開発者はAIの背後にある数学を理解する必要があり、ソフトウェアやツールは複雑で散在しており、枠組みやデータを実行するハードウェアやクラウドサービスは高価です。
本日、当社はスタックにもう1つ機能を追加し、誰もがCloudflare Workers上で機械学習モデルを実行し、推論を行えるようにします。
Constellationについて
Constellationを使用すると、Cloudflare Workersスクリプトでネイティブにトレーニング済みの機械学習モデルを使い、高速かつ低遅延の推論タスクを実行することができます。
Constellationでデプロイできるアプリケーションをいくつか例示します:
● 画像や音声の分類や物体検出
● データ異常検知
● テキストの翻訳、要約、類似性解析
● 自然言語処理
● 感情分析
● 音声認識や音声合成
● 質問応答
開発者は、対応モデルであればどんなモデルでもConstellationにアップロードできます。モデルは独自に訓練することもできますし、HuggingFaceやONNX Zooといった機械学習ハブからトレーニング済みのモデルをダウンロードすることもできます。
しかし、モデルを訓練したり、自分でテストしていないモデルをインターネットで探すのは気が進まない人もいるでしょう。そこでCloudflareでは、検証済みですぐに使えるモデルのカタログも用意しています。
$ npx wrangler constellation project create "image-classifier" ONNX
当社は、優れた開発者体験と使いやすいAPIの実現を目指してConstellationを構築しました。まずは、実例をご紹介しましょう。
# Top-level configuration
name = "image-classifier-worker"
main = "src/index.ts"
compatibility_date = "2022-07-12"
constellation = [
{
binding = 'CLASSIFIER',
project_id = '2193053a-af0a-40a6-b757-00fa73908ef6'
},
]
画像分類アプリケーション
$ npm install @cloudflare/constellation --save-dev
この例では、Constellation推論APIとSqueezeNetモデルで動く画像分類アプリを構築します。SqueezeNetは、オープンソースのImageNetデータベースの画像100万枚以上を使って事前トレーニングした畳み込みニューラルネットワーク(CNN)で、画像を1000カテゴリーに分類できます。
$ wget https://github.com/microsoft/onnxjs-demo/raw/master/docs/squeezenet1_1.onnx
$ npx wrangler constellation model upload "image-classifier" "squeezenet11" squeezenet1_1.onnx
SqueezeNetは、CNN元祖の1つで画像分類のベンチマークでもあるAlexNetに比べて遥かに速く(最高3倍)遥かに小さい(最小500分の1)ですが、同等の確度を得ることができます。フットプリントが小さいため、リソースに制約のある携帯デバイスやカスタムハードウェアでの実行に理想的です。
まず、ONNX Runtimeを使ってConstellationプロジェクトを新規作成してみましょう。WranglerにConstellationの機能が組み込まれています。キーワードは「constellation」です。
$ mkdir src; cd src
$ wget https://raw.githubusercontent.com/microsoft/onnxjs-demo/master/src/data/imagenet.ts
では、wrangler.tomlという設定ファイルをプロジェクトバインディングで作成してみましょう:
import { imagenetClasses } from './imagenet';
import { Tensor, run } from '@cloudflare/constellation';
export interface Env {
CLASSIFIER: any,
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
const formData = await request.formData();
const file = formData.get("file");
const data = await file.arrayBuffer();
const result = await processImage(env, data);
return new Response(JSON.stringify(result));
},
};
async function processImage(env: Env, data: ArrayBuffer) {
const input = await decodeImage(data)
const tensorInput = new Tensor("float32", [1, 3, 224, 224], input)
const output = await run(env.CLASSIFIER, "MODEL-UUID", tensorInput);
const probs = output.squeezenet0_flatten0_reshape0.value
const softmaxResult = softmax(probs)
const results = imagenetClasses(softmaxResult, 5);
const topResult = results[0];
return topResult
}
ConstellationクライアントAPIライブラリのインストール:
トレーニング済みのSqueezeNet 1.1 ONNXモデルをプロジェクトにアップロードします。
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/mountain.png | jq .name
alp
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/car.png | jq .name
convertible
$ curl https://ai.cloudflare.com/demos/image-classifier -F file=@images/dog.png | jq .name
Ibizan hound
上述の通り、SqueezeNetは画像を1000の物体クラスに分類します。クラスは、実際はシノニムリング(synset)のリストの形になっています。synsetにはIDとラベルがあって、プリンストン大学のWordNetデータベースの語彙を基にしています。ImageNetの画像データベースでラベル付けに使われているのと同じものです。
SqueezeNetの結果を人間が読める画像クラスに変換するには、synset ID(このモデルで生成されるもの)を対応するラベルにマッピングするファイルが必要になります。
最後に、画像分類スクリプトをコーディングしてデプロイしましょう:
このスクリプトは、リクエストから画像を読み込み、それを復号化して多次元テンソルfloat32にし(現在はPNGの復号化のみですが、他フォーマットの追加が可能)、Comstellationで実行するSqueezeNetモデルにフィードして結果を得、それをImageNetのクラスリストと照合して、人間が読める画像タグを返します。
極めてシンプルでしょう?ではテストしてみましょう:
ここではクラス確率を実際に見ることができます。このモデルでは、アルプス(Alp)とコンバーチブル(Convertible)については高確率、イビザンハウンド(Ibizan hound)ハウンドについては低確率になっています。実際、写真の犬は他の犬種です。
この小規模なアプリから、Workers上にアプリケーションを構築すれば機械学習モデルとConstellationの使用を簡単に、すばやく始められることがわかります。完全なソースコードはこちらです。ご自分でデプロイしてください。
Transformers
TransformersはGoogleが発表したもので、時系列入力データを処理するために設計された深層学習モデルです。翻訳、要約、感情分析や、画像分類を含むコンピュータービジョン(CV)分野のタスクなど、自然言語処理(NLP)によく用いられます。
import { Tensor, run } from '@cloudflare/constellation';
import * as PostalMime from 'postal-mime';
export interface Env {
SENTIMENT: any,
}
export default {
async email(message, env, ctx) {
const rawEmail = await streamToArrayBuffer(event.raw, event.rawSize);
const parser = new PostalMime.default();
const parsedEmail = await parser.parse(rawEmail);
const input = tokenize(parsedEmail.text)
const output = await run( env.SENTIMENT, "MODEL-UUID", input);
var headers = new Headers();
headers.set("X-Sentiment", idToLabel[output.label]);
await message.forward("gooddestination@example.com", headers);
}
}
Transformers.jsは、HuggingFaceからTransformerモデルを読み込んで、WebAssemblyにコンパイルしたONNX Runtimeを使ってブラウザー内で実行する人気のデモです。当社はこのデモを移植し、代わりにConstellation APIを使うようにしました。
当社バージョンへのリンクはこちら:https://transformers-js.pages.dev/
Workersとの相互運用性
Constellationのもう1つの興味深い要素は、Workersでネイティブに実行するため、当社スタックの他の製品やAPIと連携させることができる点です。KV、R2、D1、Queuesはもちろん、メールも含めたあらゆるものが使えます。
下記はWorkerの使用例です。Email Routingを使ってお客様のドメインへのメールをCloudflareで受信し、感情分析モデル t5-small でConstellationを実行し、結果スコアを含めたヘッダーを追加して送信先アドレスへ転送しています。
このようにすれば、Gmailや他のあらゆるメールクライアントを使って、「X-Sentiment」ヘッダーに基づいてメッセージにルールを適用することができます。例えば、怒気を含むメールを到着時にすべて受信箱から出して別フォルダーに仕分けしたい場合などです。
Constellationの利用開始
Constellationは本日、プライベートベータ版として提供を開始します。順番待ちリストへのご登録は、ダッシュボードを開き、Your AccountからWorkersタブをクリックし、【アクセスをリクエスト(Request Access)】ボタンをクリックしてください。アカウントのオンボーディングはバッチにまとめて実施します。お客様のアカウントが有効化されましたら、メールで通知します。
それまでに、Constellationの開発者向けドキュメントを読んで仕組みやAPIの詳細をご確認いただけます。Constellationは、Cloudflareの開発者向け製品でアプリケーションの設定、構築、展開を行うコマンドラインツールWranglerから利用可能ですし、ダッシュボードUIで直接管理することもできます。
お客様が機械学習やAIをアプリケーションにどう活かしたいとお考えか、ぜひお聞かせください。Constellationは今後も上限の引き上げ、ランタイムの延長サポート、モデルの大型化など、改良を重ねていきます。ご意見、ご要望などをお聞かせください。お客様のフィードバックは、ロードマップの決断にもちろん影響を与えます。
最後に一言:本日は、Constellationを使うWorkersの書き方についてお話してきましたが、そもそもConstellation自体がWebAssembly、Workers、R2、Cloudflare APIの力を使って構築されています。構築のしかたについてフォローアップのブログをまもなく書きますので、どうぞお見逃しなく。
いつものように、当社へのご相談はDevelopers Discord(#constellationチャンネル経由)またはコミュニティフォーラムで。当社チームが拝聴しています。