Transformers.jsにおける提案中のCross-Origin Storage APIの実験
この記事では、Cross-Origin Storage(COS)APIの提案を紹介します。このAPIは、暗号化ハッシュを使用してファイルを識別することで、WebアプリがAIモデルやWasmランタイムなどの大規模ファイルをオリジン間で共有できるようにします。Transformers.jsを例に、現在のキャッシュ分離が引き起こす重複ダウンロードの問題と、COSがハッシュベースの識別、柔軟なアクセス制御、整合性検証によってどのように解決するかを説明します。
Web開発において、Transformers.jsライブラリは、タスク固有のパイプラインを通じてWebアプリでTransformerモデルを簡単に利用できるようにします。たとえば、自動音声認識(ASR)パイプラインの作成は数行のコードで完了します。しかし、異なるオリジンのWebアプリが同じAIモデルやWasmランタイムファイルを使用する場合、ブラウザはキャッシュ分離のためにこれらのリソースを重複してダウンロードし、保存します。
Chromeなどのブラウザは、ネットワーク分離キー(トップレベルサイトと現在のフレームサイトで構成)を使用してキャッシュを分離しているため、リソースURLがまったく同じであってもキャッシュヒットしません。つまり、2つの異なるオリジンのアプリが同一のWasmランタイムファイルを使用する場合、それぞれが独立してダウンロードとキャッシュを行う必要があります。たとえば、単純なASRモデル(Xenova/whisper-tiny.en)を異なるオリジンで使用すると、177 MBの重複ダウンロードが発生します。さらに悪いことに、異なるAIモデルでも、同じWasmランタイム(たとえば4.7 MBのort-wasm-simd-threaded.asyncify.wasm)を共有している場合、そのランタイムも重複してダウンロードされ、キャッシュされます。
この問題を解決するために、Cross-Origin Storage(COS)APIが提案されました。このAPIはnavigator.crossOriginStorageインターフェースを導入し、アプリがURLではなく暗号化ハッシュでファイルを識別できるようにします。アプリはまずハッシュを使ってCOSからリソースを取得しようとし、失敗した場合にネットワークからダウンロードしてCOSに保存します。同じハッシュを持つファイルは、異なるオリジンのアプリ間で共有されます。
COSはアクセス制御も柔軟に設定できます:origins: '*'でグローバル共有、特定のオリジンリストで制限、originsを省略すると同一サイトのみとなります。アクセス権は制限から開放へのアップグレードのみ可能で、ダウングレードは防止されます。また、ファイル書き込み時にブラウザが自動的にハッシュを検証し、データの整合性を保証します。
COSはまだ初期段階の提案であり、どのブラウザにもネイティブ実装されていませんが、公式拡張機能をインストールしてpolyfillを注入することで実験できます。このAPIの潜在的な利点は、AIモデルやWasmランタイムのような大規模リソースのオリジン間重複キャッシュを排除し、Webアプリのパフォーマンスとストレージ効率を向上させることです。