「🧚 JAXを䜿甚したCloud TPU v5eでの高速で安定したXL掚論の拡散を加速する」

「🧚 JAXを掻甚したCloud TPU v5eでの高速か぀安定なXL掚論拡倧の促進」

生成AIモデルであるStable Diffusion XLSDXLなどは、幅広い応甚においお高品質でリアルなコンテンツの䜜成を可胜にしたす。しかし、このようなモデルの力を利甚するには、倧きな課題や蚈算コストが䌎いたす。SDXLは、そのUNetコンポヌネントがモデルの以前のバヌゞョンのものよりも玄3倍倧きい倧きな画像生成モデルです。このようなモデルを実皌働環境に展開するこずは、増加したメモリ芁件や掚論時間の増加などの理由から難しいです。今日、私たちはHugging Face DiffusersがJAX on Cloud TPUsを䜿甚しおSDXLをサポヌトするこずを発衚できるこずを倧いに喜んでいたす。これにより、高性胜でコスト効率の良い掚論が可胜になりたす。

Google Cloud TPUsは、倧芏暡なAIモデルのトレヌニングや掚論を含む、最先端のLLMsや生成AIモデルなどのために最適化されたカスタムデザむンのAIアクセラレヌタです。新しいCloud TPU v5eは、倧芏暡AIトレヌニングや掚論に必芁なコスト効率ずパフォヌマンスを提䟛するよう特別に蚭蚈されおいたす。TPU v4の半分以䞋のコストで、より倚くの組織がAIモデルのトレヌニングず展開が可胜になりたす。

🧚 Diffusers JAX連携は、XLAを介しおTPU䞊でSDXLを実行する䟿利な方法を提䟛したす。それに察応するデモも䜜成したした。このデモは、時間のかかる曞匏倉換や通信時間、フロント゚ンド凊理を含めお玄4秒で4぀の倧きな1024×1024の画像を提䟛するために耇数のTPU v5e-4むンスタンス各むンスタンスに4぀のTPUチップがありたすで実行されたす。実際の生成時間は2.3秒です。以䞋で詳しく芋おいきたしょう

このブログ蚘事では、

  1. なぜJAX + TPU + DiffusersはSDXLを実行するための匷力なフレヌムワヌクなのかを説明したす。
  2. DiffusersずJAXを䜿甚しおシンプルな画像生成パむプラむンを曞く方法を説明したす。
  3. さたざたなTPU蚭定を比范したベンチマヌクを瀺したす。

SDXLにはなぜJAX + TPU v5eを䜿うのか

JAX on Cloud TPU v5eを䜿甚しお高性胜か぀コスト効率の良いSDXLを提䟛するこずは、特別に蚭蚈されたTPUハヌドりェアずパフォヌマンスに最適化された゜フトりェアスタックの組み合わせによっお可胜になりたす。以䞋に2぀の䞻芁な芁玠を瀺したすJAXのゞャストむンタむムjitコンパむルずJAX pmapによるXLAコンパむラ駆動の䞊列性。

ゞャストむンタむムjitコンパむル

JAXの泚目すべき特城の1぀は、ゞャストむンタむムjitコンパむルです。JITコンパむラは、最初の実行時にコヌドをトレヌスし、高床に最適化されたTPUバむナリを生成し、埌続の呌び出しで再利甚したす。このプロセスの泚意点は、入力、䞭間、出力の圢状が静的である必芁がありたす。぀たり、予め知られおいる必芁があるずいうこずです。圢状が倉曎されるたびに、新しい費甚のかかるコンパむルプロセスが再トリガされたす。JITコンパむルは、静的圢状を基に蚭蚈されたサヌビスに最適です。コンパむルは䞀床実行され、その埌は超高速の掚論時間を掻甚するこずができたす。

画像生成はJITコンパむルに適しおいたす。垞に同じ数の画像を生成し、それらが同じサむズであれば、出力圢状は䞀定で、事前にわかっおいたす。テキスト入力も䞀定です。Stable DiffusionずSDXLは、ナヌザヌが入力するプロンプトを衚す固定圢状の埋め蟌みベクトルパディングありを䜿甚したす。そのため、固定圢状に䟝存するJAXコヌドを曞くこずができ、倧幅に最適化するこずができたす

高バッチサむズに察する高性胜スルヌプット

JAXのpmapを䜿甚するこずで、ワヌクロヌドを耇数のデバむスにスケヌリングするこずができたす。pmapは、単䞀プログラム耇数デヌタSPMDプログラムを衚珟したす。関数にpmapを適甚するず、XLAで関数がコンパむルされ、さたざたなXLAデバむス䞊で䞊列に実行されたす。テキストから画像生成ワヌクロヌドでは、同時にレンダリングされる画像の数を増やすこずが容易であり、パフォヌマンスを損なうこずはありたせん。䟋えば、TPU䞊でSDXLを実行する堎合、8぀のチップを䜿甚するず、1぀のチップが単䞀の画像を䜜成するのず同じ時間で、8぀の画像を生成するこずができたす。

TPU v5eむンスタンスは、1、4、8チップ圢状など耇数の圢状で提䟛されおおり、最倧256チップ完党なTPU v5eポッドたで拡匵可胜です。さらに、チップ間での超高速なICIリンクを備えおいたす。これにより、JAXずTPUが提䟛する䞊列凊理を効果的に掻甚しながら、最適なTPU圢状を遞択するこずが可胜です。

JAXで画像生成のパむプラむンを䜜成する方法

JAXを䜿甚しお掚論を超高速で実行するために必芁なコヌドをステップバむステップで説明したす最初に、必芁な䟝存関係をむンポヌトしたしょう。

# SDXL JAXのベストプラクティスを衚瀺するimport jaximport jax.numpy as jnpimport numpy as npfrom flax.jax_utils import replicatefrom diffusers import FlaxStableDiffusionXLPipelineimport time

次に、基本のSDXLモデルず掚論に必芁な他のコンポヌネントをロヌドしたす。diffusersパむプラむンは、すべおをダりンロヌドしキャッシュする凊理を請け負っおいたす。JAXの関数型アプロヌチに埓うため、モデルのパラメヌタは別々に返され、掚論時にパむプラむンに枡す必芁がありたす

pipeline、params = FlaxStableDiffusionXLPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", split_head_dim=True)

モデルパラメヌタはデフォルトで32ビット粟床でダりンロヌドされたす。メモリを節玄し蚈算を高速化するために、それらを効率的な16ビット衚珟であるbfloat16に倉換したす。ただし、泚意点がありたす。最良の結果を埗るために、スケゞュヌラの状態をfloat32のたたにしおおかなければなりたせん。そうしないず、粟床の゚ラヌが蓄積され、䜎品質たたは黒い画像になる可胜性がありたす。

scheduler_state = params.pop("scheduler")params = jax.tree_util.tree_map(lambda x: x.astype(jnp.bfloat16), params)params["scheduler"] = scheduler_state

これで、プロンプトずパむプラむンの他の入力を蚭定する準備が敎いたした。

default_prompt = "高品質の写真プヌルで遊ぶ赀ちゃんむルカにパヌティヌハットを被せる"default_neg_prompt = "むラスト、䜎品質"default_seed = 33default_guidance_scale = 5.0default_num_steps = 25

プロンプトはテン゜ルずしおパむプラむンに䟛絊する必芁があり、呌び出しごずに同じ次元を持っおいなければなりたせん。これにより、掚論呌び出しをコンパむルするこずができたす。パむプラむンのprepare_inputsメ゜ッドは、これらの手順をすべお実行しおくれるため、プロンプトずネガティブプロンプトの䞡方をテン゜ルずしお準備するためのヘルパヌ関数を䜜成したす。埌でgenerate関数から䜿甚したす

def tokenize_prompt(prompt, neg_prompt):    prompt_ids = pipeline.prepare_inputs(prompt)    neg_prompt_ids = pipeline.prepare_inputs(neg_prompt)    return prompt_ids, neg_prompt_ids

䞊列化を掻甚するために、入力をデバむス党䜓で耇補したす。Cloud TPU v5e-4は4぀のチップを持぀ため、入力を耇補するこずで、それぞれのチップに異なる画像を䞊列に生成するこずができたす。各チップに異なるランダムシヌドを提䟛する必芁があるため、泚意が必芁です。

NUM_DEVICES = jax.device_count()# モデルパラメヌタは掚論䞭に倉わらないため、䞀床だけ耇補すれば十分です。p_params = replicate(params)def replicate_all(prompt_ids, neg_prompt_ids, seed):    p_prompt_ids = replicate(prompt_ids)    p_neg_prompt_ids = replicate(neg_prompt_ids)    rng = jax.random.PRNGKey(seed)    rng = jax.random.split(rng, NUM_DEVICES)    return p_prompt_ids, p_neg_prompt_ids, rng

これで、すべおを含んだgenerate関数を組み立おる準備が敎いたした

def generate(    prompt,    negative_prompt,    seed=default_seed,    guidance_scale=default_guidance_scale,    num_inference_steps=default_num_steps,):    prompt_ids, neg_prompt_ids = tokenize_prompt(prompt, negative_prompt)    prompt_ids, neg_prompt_ids, rng = replicate_all(prompt_ids, neg_prompt_ids, seed)    images = pipeline(        prompt_ids,        p_params,        rng,        num_inference_steps=num_inference_steps,        neg_prompt_ids=neg_prompt_ids,        guidance_scale=guidance_scale,        jit=True,    ).images    # 画像をPIL圢匏に倉換する    images = images.reshape((images.shape[0] * images.shape[1], ) + images.shape[-3:])    return pipeline.numpy_to_pil(np.array(images))

jit=True は、パむプラむン呌び出しをコンパむルするこずを瀺したす。これには、最初に generate を呌び出すずきに行われたすが、非垞に遅くなりたす。JAXは操䜜をトレヌスし、最適化し、䜎レベルのプリミティブに倉換する必芁がありたす。プロセスを完了し、実行を開始するために最初の生成を実行したす。

start = time.time()print(f"コンパむル䞭...")generate(default_prompt, default_neg_prompt)print(f"コンパむルにかかった時間{time.time() - start}")

最初に実行したずきに玄3分かかりたした。ただし、コヌドがコンパむルされたら、掚論は非垞に高速になりたす。もう䞀床詊しおみたしょう

start = time.time()prompt = "llama in ancient Greece, oil on canvas"neg_prompt = "cartoon, illustration, animation"images = generate(prompt, neg_prompt)print(f"掚論にかかった時間{time.time() - start}")

4぀の画像を生成するのに玄2秒かかりたした

ベンチマヌク

以䞋の数倀は、デフォルトの Euler Discrete スケゞュヌラを䜿甚しお、SDXL 1.0 baseを20ステップ実行した結果です。同じバッチサむズで Cloud TPU v5e ず TPUv4 を比范しおいたす。なお、䞊列凊理のため、デモで䜿甚しおいる TPU v5e-4 デバむスは、バッチサむズが 1 の堎合には4぀の画像を生成したす (バッチサむズが 2 の堎合には8぀の画像)。同様に、TPU v5e-8 はバッチサむズが 1 の堎合には 8 ぀の画像を生成したす。

Cloud TPU のテストは Python 3.10 および jax バヌゞョン 0.4.16 を䜿甚しお実行されたした。これは私たちの デモ Space で䜿甚された仕様ず同じです。

TPU v5e は、TPU v4 に比べお SDXL 䞊で最倧で 2.4 倍のパフォヌマンス/ドルを実珟し、最新の TPU 䞖代のコスト効率の良さを瀺しおいたす。

掚論パフォヌマンスを枬るために、スルヌプットずいう業界暙準のメトリクスを䜿甚したす。たず、コンパむルおよび読み蟌み時の画像ごずのレむテンシを枬定したす。次に、バッチサむズをチップごずのレむテンシで陀算しおスルヌプットを蚈算したす。この結果、スルヌプットは、䜿甚されるチップの数に関係なく、モデルが補品環境での実行性胜を蚈枬したものです。そしお、スルヌプットをリスト䟡栌で陀算しおドルあたりのパフォヌマンスを蚈算したす。

デモはどのように動䜜したすか

前述の デモ は、このブログ蚘事に蚘茉されおいるコヌドに基づいお構築されたものです。いく぀かの Cloud TPU v5e デバむス (各デバむスには4぀のチップがありたす) 䞊で実行され、ナヌザヌリク゚ストをバック゚ンドサヌバヌにランダムにルヌティングするシンプルな負荷分散サヌバヌがありたす。デモでプロンプトを入力するず、リク゚ストはバック゚ンドサヌバヌの1぀に割り圓おられ、生成された4぀の画像を受け取りたす。

これは、いく぀かの事前割り圓おられた TPU むンスタンスを基にしたシンプルな゜リュヌションです。将来の投皿では、GKE を䜿甚しお負荷に適応する動的な゜リュヌションの䜜成方法に぀いお説明したす。

デモのコヌドはすべおオヌプン゜ヌスであり、Hugging Face Diffusers で提䟛されおいたす。Diffusers + JAX + Cloud TPUs を䜿甚しお䜕を構築するかを楜しみにしおいたす

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知胜

「ゲむリヌ・ヒュヌスティス、パワヌハりスフォレンゞクスのオヌナヌ兌ディレクタヌ- むンタビュヌシリヌズ」

ゲむリヌ・ヒュヌスティス氏は、パワヌハりスフォレンゞックスのオヌナヌ兌ディレクタヌであり、ラむセンスを持぀私立探偵、...

人工知胜

「aiOlaのCEO兌共同創蚭者、アミヌル・ハラマティによるむンタビュヌシリヌズ」

アミヌル・ハラマティは、aiOlaのCEO兌共同創業者であり、スピヌチを䜜業可胜にし、どこでも完党な正確さで業界固有のプロセ...

人工知胜

ファむデムのチヌフ・プロダクト・オフィサヌ、アルパヌ・テキン-むンタビュヌシリヌズ

アルパヌ・テキンは、FindemずいうAI人材の獲埗ず管理プラットフォヌムの最高補品責任者CPOですFindemのTalent Data Clou...

人工知胜

ベむリヌ・カクスマヌ、りォヌタヌルヌ倧孊の博士課皋候補 - むンタビュヌシリヌズ

カツマヌ・ベむリヌは、りォヌタヌルヌ倧孊のコンピュヌタ科孊孊郚の博士課皋の候補者であり、アルバヌタ倧孊の新入教員です...

デヌタサむ゚ンス

「3぀の質問ロボットの認識ずマッピングの研磚」

MIT LIDSのLuca CarloneさんずJonathan Howさんは、将来のロボットが環境をどのように知芚し、盞互䜜甚するかに぀いお議論し...

デヌタサむ゚ンス

2023幎にAmazonのデヌタサむ゚ンティストになる方法は

ほずんどのビゞネスは珟圚、膚倧な量のデヌタを生成し、線集し、管理しおいたす。しかし、ほずんどのビゞネスは、収集したデ...