Qualiteg プロダクト開発部

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 プロダクト開発部
LLMのデータファイルを無圧縮ZIPにする

日々の開発Tips

LLMのデータファイルを無圧縮ZIPにする

LLMサービスをつくっていると、1回ダウンロードしたLLMを別のサーバーに移動するということをよくやります。 (同一構成のサーバーで同じLLMモデルつかいたいときは、たとえば、HuggingFaceから再度ダウンロードするより早いので) このときフォルダのままだと移動しづらいとき ZIP に圧縮します。 無圧縮だと、GB単位でも結構高速に圧縮できます。 ZIP のインストール sudo apt install zip -y 無圧縮ZIPの作成 対象の LLM ディレクトリを指定して、以下のコマンドを実行 たとえば、LLMディレクトリが /mnt/d/RakutenAI-7B-chat-awq のとき、 cd /mnt/c/RakutenAI-7B-chat-awq zip -r -0 /mnt/c/RakutenAI-7B-chat-awq.zip . コマンド詳細 * cd /mnt/c/RakutenAI-7B-chat-awq: 圧縮するフォルダに移動します。 * zip: zipコマンドの実行 * -r: フォルダ内のファイルやサブフォルダを再帰的

By Qualiteg プロダクト開発部
逐次生成されるトークンのバッファリング

日々の開発Tips

逐次生成されるトークンのバッファリング

こんにちは! (株)Qualiteg プロダクト開発部 です! 今日は、推論シーンでよくある、トークン細切れ問題に対処する方法をご紹介します。 ストリーミングチャットで使用する逐次生成のとき、文章は1トークンずつ生成されますが、1トークンは”単語単位”でもなければ”1文字”単位でもなく、学習時使われていたトークナイザーの処理に依存します。 一般的には 形態素解析→サブワード→語彙リスト構築 を行いますが、このとき、後で文章生成するときに重要なタグ、たとえば "<NL>" というタグが重要な意味をもつにもかかわらず、細切れにされてトークナイズされてしまうことがあります。たとえば、 "<" "N" "L>" のように粉砕されてしまうようなパターンです。 (これを避ける方法はあるのですが、今回は、学習済のモデルをあからじめ与えられた状態でどうするか、を考えます) こういうパターンが発生してしまったとき逐次生成で "

By Qualiteg プロダクト開発部
MagicAnimate を試す

非LLM生成AI

MagicAnimate を試す

Magic Animate は画像の動画化をしてくれるオープンソースです 今回は、Windows版をつかってやってみます 実験環境は Core i7 + 64GB Ram + RTX 3090 です インストールに約30分、ストレージ容量として32GB 程度消費しますのでご注意ください。 作業ディレクトリの作成 d:/ にai_experiment というディレクトリをつくり、その下で作業してみます PowerShellを開いて、以下実行します d: mkdir ai_experiment 実行結果 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS D:\> mkdir ai_experiment ディレクトリ: D:\ Mode LastWriteTime Length Name

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 プロダクト開発部