ChatStream Guide

LLMサンプリングにおける3つのペナルティ

ChatStream Guide

LLMサンプリングにおける3つのペナルティ

[付録]ペナルティの比較 ペナルティタイプ 目的 適用方法 ペナルティの例 Repetition Penalty 特定のトークンやフレーズが繰り返されるのを防ぐ。 過去に生成されたすべてのトークンのログ確率(logits)に対してペナルティを適用する。 例えば、あるトークンがすでに生成された場合、そのトークンのログ確率をペナルティ値で割る(乗算)か、ペナルティ値を引く(減算)。 Frequency Penalty 生成されたトークンの出現頻度に基づいてペナルティを適用し、頻繁に出現するトークンを抑制する。 各トークンが生成された回数に基づいてペナルティを適用する。トークンが出現するたびに、そのトークンの出現確率を低減させる。 トークンが出現するたびに、そのトークンのログ確率をペナルティ値で累積的に割る(乗算)か、ペナルティ値を累積的に引く(減算)。 Presence Penalty すでに生成されたトークンが再度出現するのを防ぐ。 トークンが一度でも生成されたかどうかに基づいてペナルティを適用する。一度生成されたトークンには再出現の際にペナルティが適用さ

By Qualiteg プロダクト開発部
LLM サービング効率化の為のPagedAttention

ChatStream Guide

LLM サービング効率化の為のPagedAttention

こんにちは、株式会社Qualitegプロダクト開発部です。 今日は 商用LLM サービングに欠かせない PagedAttention 技術をご紹介します はじめに PagedAttention は当社にとって非常に重要な技術です PagedAttentionを活用するとLLMでの文章生成において GPUメモリの利用効率をあげ 、そのぶん単位GPUあたりの同時に捌けるリクエストを増やすことができます。 当社は「ChatStream」という商用のLLMサービングプラットフォームを開発・提供しているため、多ユーザーからの同時リクエストによる高負荷環境でのLLMサービング(文章生成の提供)は、ドドド真ん中の課題ということになります。 PagedAttention登場以前の従来の並列生成はKVキャッシュとよばれる”リクエストごとに発生する大きなGPUメモリ消費”との戦いでした。 (KVキャッシュは transfomerのmodelを生で叩くときに past_key_values として登場します) つまりモデルのパラメータとは別に発生する推論時のメモリ消費です。 これが同時に

By Qualiteg プロダクト開発部
[ChatStream] meta-llama/Meta-Llama-3-8B-Instruct 用の ChatPromptクラス

ChatStream Guide

[ChatStream] meta-llama/Meta-Llama-3-8B-Instruct 用の ChatPromptクラス

昨日(2024/4/19) に発表になった Llama3 用の ChatPrompt クラス※をご紹介します。 from chatstream import AbstractChatPrompt SYSTEM_PROMPT = """\ You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal

By Qualiteg プロダクト開発部
RakutenAI-7B-chat を使用したチャットアプリケーションを5分で作る

ChatStream Guide

RakutenAI-7B-chat を使用したチャットアプリケーションを5分で作る

こんにちは、株式会社 Qualiteg プロダクト開発部です。 今日は、 RakutenAI-7B-chat と ChatStream 0.7.0 を使用して本格的なチャットアプリケーションを作っていきましょう。 RakutenAI-7B-chat は Mistral 7B を日本語継続学習させたモデルで、チャットチューニングが行われており、 日本語LLM リーダーボード https://wandb.ai/wandb-japan/llm-leaderboard/reports/Nejumi-LLM-Neo--Vmlldzo2MTkyMTU0でも上位にランクされている期待大のモデルです。 ソースコード 早速ですが、以下がソースコードとなります。 4bit 量子化をしているため、使用する GPU は A4000 (16GB) 程度で快適に動作します。 import logging import torch import uvicorn from fastapi import FastAPI from transformers

By Qualiteg プロダクト開発部
[ChatStream] Rakuten/RakutenAI-7B-chat用の ChatPrompt

ChatStream Guide

[ChatStream] Rakuten/RakutenAI-7B-chat用の ChatPrompt

昨日発表された Rakuten/RakutenAI-7B-chat 用の ChatPrompt をご紹介します from chatstream import AbstractChatPrompt SYSTEM_PROMPT = """\ A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. \ """ class ChatPromptRakutenMistral(AbstractChatPrompt): def __init__(self): super(

By Qualiteg プロダクト開発部
[ChatStream] lightblue/karasu-7B-chat-plus 用 ChatPrompt

ChatStream Guide

[ChatStream] lightblue/karasu-7B-chat-plus 用 ChatPrompt

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では lightblue/karasu-7B-chat-plus 用の ChatPrompt をご紹介します。 旧バージョンの ChatStream をご利用のお客様は本ChatPromptをインポートすることで利用可能となります。(最新の配信バージョンではバンドルされております) from chatstream import AbstractChatPrompt from chatstream.chat_prompt.role_type import RoleType SYSTEM_PROMPT = """\ あなたはAIアシスタントです。\ """ class ChatPromptLightblueKarasuChatPlus(AbstractChatPrompt): def __init__(self): super().__init__() # Call the initialization of the base

By Qualiteg プロダクト開発部
[ChatStream] Llama2 対応の ChatPrompt実装

ChatStream Guide

[ChatStream] Llama2 対応の ChatPrompt実装

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、 ChatStream にLlama2 対応の ChatPrompt を同梱いたしましたのでご紹介いたします! 現在の ChatPrompt は以下とおりとなっております。旧バージョンのChatStreamをご利用の場合も、以下コードにて Llama2対応可能です。(もちろん最新バージョンのChatStreamには同梱済です) from chatstream import AbstractChatPrompt from chatstream.chat_prompt.role_type import RoleType SYSTEM_PROMPT = """\ You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while

By Qualiteg プロダクト開発部
[ChatStream] rinna/nekomata-14b-instruction 用の ChatPromptクラス

ChatStream Guide

[ChatStream] rinna/nekomata-14b-instruction 用の ChatPromptクラス

2023/12/21 に発表された rinna/nekomata-14b-instruction 用の ChatPrompt をご紹介します nekomataシリーズは Qwen をベースモデルしているおり、語彙サイズが 15.2万とこれまでより大幅に大きいため、日本語対応にもおおいに期待できそうですね 今回はInstructionチューニングされたモデルをChatStreamのチャットモードで利用するためのChatPromptを作りました。 設計思想としましては、あるタスクとChatPrompt を対応させる、という考え方です。簡単にいうと、1つのChatPromptは1つの仕事に特化させる、というところでしょうか。 たとえば、今回は、「翻訳」というタスクに特化した ChatPrompt の例です。 これにより 翻訳 というタスクに対して、 「入力」と「出力」というをチャットインタフェースを通して行います。 from chatstream import AbstractChatPrompt from chatstream.chat_prompt.prompt_ttl im

By Qualiteg プロダクト開発部
[ChatStream] 時間のかかるモデル読み込みにプログレスバーをつける

ChatStream Guide

[ChatStream] 時間のかかるモデル読み込みにプログレスバーをつける

こんにちは (株)Qualiteg プロダクト開発本部です! HuggingFace の LLMのモデル読み込み時間ってとても長いですよね、そんなときに、便利なツールをご紹介します。 HuggingFace の LLM モデルはダウンロードするときは、進捗がでるのですが、ひとたびダウンロードしたあとは、読み込むまで短くて数分、長くて数十分待たされます。これはディスクからモデルデータ(weights and bias)を処理しながらGPUのVRAMに読み込む処理に時間がかかるのですが、その読み込み状態がいったいいまどのくらいなのか、これがわからず、ヤキモキしたことは無いでしょうか。 そこでは ChatStreamの便利機能として、以下のように、このモデル読み込み時間のプログレス表示をすることができます。 仕掛けはいたってシンプルで、初回の読み込み実行時に処理時間を計測しておき、2回目、また同じ処理が呼ばれたときはプログレスバーを表示します。 使い方も簡単で、モデルの読み込みを LoadTime でラップするだけで、プログレスバーつきで読み込むことができます Before

By Qualiteg プロダクト開発部
[ChatStream] Transformer応答をモックする Transformer Mock

ChatStream Guide

[ChatStream] Transformer応答をモックする Transformer Mock

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、モックデータの作成方法について説明します! これは正式には「Transformer Mock」と呼ばれている機能のためのもので、実際のLLM出力をレコーディングして再現するためのものです。 なぜこんなことが必要かというと、 LLM アプリのテスト(単体テストなど)で使用します。LLMアプリのテストをするとき、古典的な単体テストでは、入力に対して期待する出力は固定されていることが前提です。 ところがLLMはその特性上、同一の入力に対しても毎回異なる応答を返してきます。そこが生成AIの良いところですが古典的な単体テストをするときには悩んでしまいます。 ここで賢い読者の皆様は、同一の入力に対して、同一の出力を得たいなら、シードを固定すればいいじゃん。とお考えの方もいらっしゃるとおもいますが、シード値を固定して、入力を固定して、各種サンプリングパラメータを固定しても GPUの種類が異なると異なる出力を出してしまう、ということがわかっています。 これでは、GPUを変更したとたんに単体テストが通らなくなって困ってし

By Qualiteg プロダクト開発部
[ChatStream] LLMの読み込みが長いときは Generator Mock レスポンス

ChatStream Guide

[ChatStream] LLMの読み込みが長いときは Generator Mock レスポンス

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、LLMの読み込みに時間がかかるときに使えるテクニックについてご紹介いたします。 テスト用途や、ChatStream の API をつかったサンプルアプリを実装したいときに、何度か ChatStream を再起動しては、試してみたいというシーンがあります。そういうときに、本来は LLM として読み込まなくても、ChatStreamのAPIにそった”決まり切った”レスポンスで問題がないという場合があります。 このとき、サイズの小さなLLMを読んで読み込み時間を短縮するというワザもあるのですが、そもそも、固定的なレスポンスを返してくれればそれでOKという場合は、 Mockレスポンス を指定することができます。 再起動のたびに、 LLM を読み込む時間にストレスを感じていた方はぜひこちらをお試しくださいませ! Generator Mockレスポンスの利用(高速起動) Generator Mockレスポンスを使用すると読み込みに時間のかかる事前学習済言語モデルのかわりに、ダミーの文章を生成させることがで

By Qualiteg プロダクト開発部
[ChatStream] コンソールチャットの作成

ChatStream Guide

[ChatStream] コンソールチャットの作成

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、 ChatStream を使って、コンソールチャットを作成する方法について説明いたします! handle_console_input メソッドを使用することで CLI ベースのチャットを簡単に作成しモデルを試すことができます chat.py import asyncio import torch from transformers import AutoTokenizer, AutoModelForCausalLM from chatstream import ChatStream, ChatPromptTogetherRedPajamaINCITEChat as ChatPrompt, LoadTime model_path = "togethercomputer/RedPajama-INCITE-Chat-3B-v1" device = "cuda" # "cuda" / "cpu"

By Qualiteg プロダクト開発部
[ChatStream] Web サーバー(ASGI server) の起動

ChatStream Guide

[ChatStream] Web サーバー(ASGI server) の起動

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、 ChatStream 搭載した Webサーバーの起動方法について説明いたします! uvicorn(内部起動) ChatStreamは FastAPI/Starlette に対応しているため、 ASGI サーバーで動作させることができます。 uvicorn をコード内で定義するには以下のように実装します def start_server(): uvicorn.run(app, host='localhost', port=9999) def main(): start_server() if __name__ == "__main__": main() ソースコード全体 import torch import uvicorn from fastapi import FastAPI,

By Qualiteg プロダクト開発部
[ChatStream] キューイングシステムと同時処理制限

ChatStream Guide

[ChatStream] キューイングシステムと同時処理制限

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、 ChatStream のキューイングシステムについてご説明いたします! キューイングシステムとは ChatStream は多数同時アクセス要求が来たときに、 リクエストをキューイングし、同時に実行できる文章生成の数を制限することができます。 GPU や CPU の性能に応じて、文章生成処理の同時実行数を制限することで、良好な応答性能を得ることができます。 また同時実行数を超えるリクエストがあった場合はリクエストをキューイング(待ち行列に追加)し、 順次実行することで、負荷を適切にコントロールします。 同時実行とは 同時実行とは 1GPU で実行する場合には、正確には同時実行ではなく 並行実行(concurrent) となります。 同時実行数をセットすると、その数だけ 並行実行 されます。 たとえば、同時実行数の最大値が2に設定されている状態で、2人のユーザー1、ユーザー2 が同じタイミングにリクエストしてきた場合 2人のリクエストは 処理キュー (文章生成中をあらわす

By Qualiteg プロダクト開発部
[ChatStream] Web API エンドポイントの実装

ChatStream Guide

[ChatStream] Web API エンドポイントの実装

こんにちは! (株)Qualiteg プロダクト開発部 です! 本稿では、 ChatStream を FastAPI の Web API として実装する方法についてご説明いたします! エンドポイントの実装 /chat_stream という URL パスに、ストリーミングチャット用のWebエンドポイントをつくるには 以下のように handle_chat_stream_request を呼び出します。 これだけで、ユーザーからのリクエストは 文章生成の同時実行数を制御したストリーミングチャットの実装は完了です @app.post("/chat_stream") async def stream_api(request: Request): # handling FastAPI/Starlette's Request response = await chat_

By Qualiteg プロダクト開発部
[ChatStream] 生成と初期化

ChatStream Guide

[ChatStream] 生成と初期化

こんにちは (株)Qualiteg プロダクト開発本部です! 本稿では、 ChatStream の生成と初期化についてご説明いたします! ChatStream クラスは ChatStream パッケージのコアとなるクラスで、FastAPI/Starlette の Request を受け取り、 負荷制御をしながらストリーミングレスポンスをクライアントに送出する役割をもっています。 以下のように model,tokenizer,device, 最大同時処理数 num_of_concurrent_executions 、待ち行列の最大数 max_queue_size ,プロンプトクラス ChatPrompt を指定して初期化します tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16) model.

By Qualiteg プロダクト開発部