HuggingFace ブログ : Hugging Face 推論エンドポイントによる LLM の配備

HuggingFace ブログ : Hugging Face 推論エンドポイントによる LLM の配備 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/16/2023

* 本ページは、HuggingFace Blog の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace ブログ : Hugging Face 推論エンドポイントによる LLM の配備

Falcon, (Open-)LLaMA, X-Gen, StarCoderRedPajama のようなオープンソースの LLM はここ数ヶ月で大きな進歩を遂げ、そして特定のユースケースに対しては ChatGPT や GPT4 のようなクローズドソースなモデルと張り合うことができます。けれども、これらのモデルを効率的で最適化された方法で配備することは依然として課題を提示しています。

このブログ記事では、オープンソースの LLM を (モデルの配備を簡単にする私たちのマネージド SaaS ソリューションである) Hugging Face 推論エンドポイント に配備する方法を示します。更に、レスポンスをストリームし、エンドポイントのパフォーマンスをテストする方法を教えます。So let’s get started!

  1. Falcon 40B instruct の配備方法
  2. LLM エンドポイントのテスト
  3. Javascript と Python でレスポンスをストリームする

Before we start, let’s refresh our knowledge about Inference Endpoints.

 

Hugging Face 推論エンドポイントとは何か

Hugging Face 推論ポイント はプロダクションユースのために機械学習モデルを配備する簡単で安全な方法を提供します。推論エンドポイントは開発者やデータサイエンティストにインフラを管理することなしに AI アプリケーションを作成することを可能にします : 大量のリクエストの autoscaling による処理、scale-to-zero によるインフラコストの削減、高度なセキュリティの提供等々、配備プロセスを数クリックに単純化します。

ここに LLM 配備のための最も重要な機能の幾つかがあります :

  1. 簡単な配備 : 数回のクリックだけでモデルをプロダクション ready な API として配備し、インフラや MLOps を処理する必要性を取り除きます。

  2. コスト効率性 : 自動 scale-to-zero 機能の恩恵を受けて、エンドポイントが使用されていないときインフラをスケールダウンすることでコストを削減し、エンドポイントのアップタイムに基づいて支払をすることで、費用対効果を確保します。

  3. 企業セキュリティ : SOC2 Type 2 認証により支援された、ダイレクト VPC コネクションだけを通してアクセス可能な安全なオフラインエンドポイント内でモデルを配備し、強化されたデータセキュリティとコンプライアンスにのために BAA と GDPR データ処理 agreements を提供します。

  4. LLM 最適化 : LLM に対して最適化され、Paged アテンションを使用して高いスループット、そしてテキスト生成推論により強化されたカスタム transformers コードと Flash アテンションにより低レイテンシーを可能にしています。

  5. 包括的なタスクサポート : 🤗 Transformers, Sentence-Transformers, そして Diffusers タスクとモデルに対するサポート、話者ダイアライゼーションや任意の機械学習タスクのような高度なタスクを可能にする簡単なカスタマイゼーション、ライブラリ。

推論エンドポイントを https://ui.endpoints.huggingface.co/ で始めることができます。

 

1. Falcon 40B instruct の配備方法

始めるには、登録された支払い方法を持つユーザか組織アカウントでログインして (ここ で追加できます)、そして https://ui.endpoints.huggingface.co の推論エンドポイントにアクセスする必要があります。

それから、“New endpoint” をクリックします。レポジトリ、クラウド、そしてリージョンを選択し、インスタンスとセキュリティ設定を調整し、そして私たちのケースでは tiiuae/falcon-40b-instruct を配備します。

推論エンドポイントはモデルサイズに基づいてインスタンスタイプを提案します、これはモデルを実行するために十分に大きいはずです。ここでは 4x NVIDIA T4 GPUs です。LLM のために最高の性能を得るには、インスタンスを GPU [xlarge] · 1x Nvidia A100 に変更します。

Note: If the instance type cannot be selected, you need to contact us and request an instance quota.

そして “Create Endpoint” をクリックすることでモデルを配備できます。10 分後、エンドポイントがオンラインとなりリクエストをサーブするために利用可能になるはずです。

 

2. LLM エンドポイントのテスト

エンドポイントの overview は推論ウイジェットへのアクセスを提供します、これは手動でリクエストを送るために使用できます。これは様々な入力でエンドポイントを素早くテストし、それをチームメンバーと共有することを可能にします。これらのウイジェットはパラメータをサポートしません – この場合にはこれは “short” 生成という結果になります。

ウィジェットはまた使用できる cURL コマンドも生成します。hf_xxx を追加してテストしてください。

curl https://j4xhm53fxl9ussm8.us-east-1.aws.endpoints.huggingface.cloud \
-X POST \
-d '{"inputs":"Once upon a time,"}' \
-H "Authorization: Bearer " \
-H "Content-Type: application/json"

生成を制御するために様々なパラメータを使用できます、それらはペイロードの parameters 属性で定義します。今日現在、以下のパラメータがサポートされています :

  • temperature: モデルのランダム性を制御します。より低い値はモデルをより決定論的にして、高い値はモデルをよりランダムにします。デフォルト値は 1.0 です。

  • max_new_tokens: 生成するトークンの最大数。デフォルト値は 20 で、最大値は 512 です。

  • repetition_penalty: 反復の尤度を制御します。デフォルトは null です。

  • seed: ランダム生成のために使用するシード。デフォルトは null です。

  • stop: 生成を停止するトークンのリスト。トークンの一つが生成されたとき生成は停止します。

  • top_k: top-k-filtering のために保持する最も高い確率の語彙トークンの数。デフォルト値は null で、これは top-k-filtering を無効にします。

  • top_p: 核 (nucleus) サンプリングのために保持するパラメータの最も高い確率の語彙トークンの累積確率、デフォルトは null です。

  • do_sample: サンプリングを使用するか否か ; そうでない場合は greedy デコーディングを使用します。デフォルト値は false です。

  • best_of: best_of シークエンスを生成してトークン logprob が最も高いものを返します、デフォルトは null です。

  • details: 生成についての詳細を返すか否か。デフォルト値は false です。

  • return_full_text: 全文か、生成された部分だけを返すか。デフォルト値は false です。

  • truncate: 入力をモデルの最大長に切り捨てるか否か。デフォルト値は true です。

  • typical_p: トークンの typical 確率。デフォルト値は null です。

  • watermark: 生成のために使用する透かし。デフォルト値は false です。

 

3. Javascript と Python のストリーム・レスポンス

LLM によるテキストのリクエストと生成は時間がかかり反復的なプロセスとなる可能性があります。ユーザ体験を改良する素晴らしい方法はトークンを生成されるときにユーザにストリームすることです。以下は Python と JavaScript を使用してトークンをストリームする方法の 2 つの例です。Python については、テキスト生成推論のクライアント を、JavaScript については、HuggingFace.js ライブラリ を使用していきます。

 

Python を使用するリクエストのストリーミング

最初に、huggingface_hub ライブラリをインストールする必要があります :

pip install -U huggingface_hub

使用したいハイパーパラメータと共に、エンドポイント URL とクレデンシャルを供給して InferenceClient を作成することができます。

from huggingface_hub import InferenceClient

# HF Inference Endpoints parameter
endpoint_url = "https://YOUR_ENDPOINT.endpoints.huggingface.cloud"
hf_token = "hf_YOUR_TOKEN"

# Streaming Client
client = InferenceClient(endpoint_url, token=hf_token)

# generation parameter
gen_kwargs = dict(
    max_new_tokens=512,
    top_k=30,
    top_p=0.9,
    temperature=0.2,
    repetition_penalty=1.02,
    stop_sequences=["\nUser:", "<|endoftext|>", ""],
)
# prompt
prompt = "What can you do in Nuremberg, Germany? Give me 3 Tips"

stream = client.text_generation(prompt, stream=True, details=True, **gen_kwargs)

# yield each generated token
for r in stream:
    # skip special tokens
    if r.token.special:
        continue
    # stop if we encounter a stop sequence
    if r.token.text in gen_kwargs["stop_sequences"]:
        break
    # yield the generated token
    print(r.token.text, end = "")
    # yield r.token.text

print コマンドを yield やトークンをストリーミングしたい関数に置き換えます。

 

JavaScript を使用するリクエストのストリーミング

最初に、@huggingface/inference ライブラリをインストールする必要があります。

npm install @huggingface/inference

使用したいハイパーパラメータと共に、エンドポイント URL とクレデンシャルを供給して HfInferenceEndpoint を作成することができます。

import { HfInferenceEndpoint } from '@huggingface/inference'

const hf = new HfInferenceEndpoint('https://YOUR_ENDPOINT.endpoints.huggingface.cloud', 'hf_YOUR_TOKEN')

//generation parameter
const gen_kwargs = {
  max_new_tokens: 512,
  top_k: 30,
  top_p: 0.9,
  temperature: 0.2,
  repetition_penalty: 1.02,
  stop_sequences: ['\nUser:', '<|endoftext|>', ''],
}
// prompt
const prompt = 'What can you do in Nuremberg, Germany? Give me 3 Tips'

const stream = hf.textGenerationStream({ inputs: prompt, parameters: gen_kwargs })
for await (const r of stream) {
  // # skip special tokens
  if (r.token.special) {
    continue
  }
  // stop if we encounter a stop sequence
  if (gen_kwargs['stop_sequences'].includes(r.token.text)) {
    break
  }
  // yield the generated token
  process.stdout.write(r.token.text)
}

process.stdout 呼び出しを yield やトークンをストリーミングしたい関数に置き換えます。

 

まとめ

このブログ記事では、Hugging Face 推論エンドポイントを使用してオープンソースの LLM を配備する方法、高度なパラメータでテキスト生成を制御する方法、そしてユーザ体験を改善するために Python や JavaScript クライアントにレスポンスをストリームする方法を示しました。Hugging Face 推論エンドポイントを使用して、数クリックだけでモデルをプロダクション ready な API として配備し、自動 scale to zero でコストを削減し、そして SOC2 Type 2 認証で支援された安全なオフライン・エンドポイントにモデルを配備できます。

 

以上