「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > グラナイトを試してみました。

グラナイトを試してみました。

2024 年 11 月 8 日に公開
ブラウズ:619

I tried out Granite .

花崗岩 3.0

Granite 3.0 は、エンタープライズ レベルのさまざまなタスク向けに設計された、オープンソースの軽量の生成言語モデル ファミリです。多言語機能、コーディング、推論、ツールの使用をネイティブにサポートしているため、エンタープライズ環境に適しています。

どのようなタスクを処理できるかを確認するために、このモデルを実行してテストしました。

環境設定

Google Colab で Granite 3.0 環境をセットアップし、次のコマンドを使用して必要なライブラリをインストールしました。

!pip install torch torchvision torchaudio
!pip install accelerate
!pip install -U transformers

実行

Granite 3.0 の 2B モデルと 8B モデルの両方のパフォーマンスをテストしました。

2Bモデル

2Bモデルを走らせました。 2B モデルのコードサンプルは次のとおりです:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "auto"
model_path = "ibm-granite/granite-3.0-2b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()

chat = [
    { "role": "user", "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." },
]
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
input_tokens = tokenizer(chat, return_tensors="pt").to("cuda")
output = model.generate(**input_tokens, max_new_tokens=100)
output = tokenizer.batch_decode(output)
print(output[0])

出力

userPlease list one IBM Research laboratory located in the United States. You should only output its name and location.
assistant1. IBM Research - Austin, Texas

8Bモデル

8Bモデルは2bを8bに置き換えて使用できます。以下は、8B モデルのロールとユーザー入力フィールドのないコード サンプルです:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "auto"
model_path = "ibm-granite/granite-3.0-8b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()

chat = [
    { "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." },
]
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)

input_tokens = tokenizer(chat, add_special_tokens=False, return_tensors="pt").to("cuda")
output = model.generate(**input_tokens, max_new_tokens=100)
generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True)
print(generated_text)

出力

1. IBM Almaden Research Center - San Jose, California

関数呼び出し

関数呼び出し機能を調査し、ダミー関数を使用してテストしました。ここでは、get_current_weather が模擬天気データを返すように定義されています。

ダミー関数

import json

def get_current_weather(location: str) -> dict:
    """
    Retrieves current weather information for the specified location (default: San Francisco).
    Args:
        location (str): Name of the city to retrieve weather data for.
    Returns:
        dict: Dictionary containing weather information (temperature, description, humidity).
    """
    print(f"Getting current weather for {location}")

    try:
        weather_description = "sample"
        temperature = "20.0"
        humidity = "80.0"

        return {
            "description": weather_description,
            "temperature": temperature,
            "humidity": humidity
        }
    except Exception as e:
        print(f"Error fetching weather data: {e}")
        return {"weather": "NA"}

プロンプト作成

関数を呼び出すためのプロンプトを作成しました:

functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and country code, e.g. San Francisco, US",
                }
            },
            "required": ["location"],
        },
    },
]
query = "What's the weather like in Boston?"
payload = {
    "functions_str": [json.dumps(x) for x in functions]
}
chat = [
    {"role":"system","content": f"You are a helpful assistant with access to the following function calls. Your task is to produce a sequence of function calls necessary to generate response to the user utterance. Use the following function calls as required.{payload}"},
    {"role": "user", "content": query }
]

応答の生成

次のコードを使用して、応答を生成しました:

instruction_1 = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
input_tokens = tokenizer(instruction_1, return_tensors="pt").to("cuda")
output = model.generate(**input_tokens, max_new_tokens=1024)
generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True)
print(generated_text)

出力

{'name': 'get_current_weather', 'arguments': {'location': 'Boston'}}

これにより、モデルが指定された都市に基づいて正しい関数呼び出しを生成できることが確認されました。

強化されたインタラクション フローのためのフォーマット仕様

Granite 3.0 では、構造化フォーマットでの応答を容易にするフォーマット指定が可能です。ここでは、応答には[UTTERANCE]、内なる思考には[THINK]を使用して説明します。

一方、関数呼び出しはプレーンテキストとして出力されるため、関数呼び出しと通常のテキスト応答を区別するための別のメカニズムを実装する必要がある場合があります。

出力形式の指定

AI の出力をガイドするためのサンプル プロンプトは次のとおりです:

prompt = """You are a conversational AI assistant that deepens interactions by alternating between responses and inner thoughts.

* Record spoken responses after the [UTTERANCE] tag and inner thoughts after the [THINK] tag.
* Use [UTTERANCE] as a start marker to begin outputting an utterance.
* After [THINK], describe your internal reasoning or strategy for the next response. This may include insights on the user's reaction, adjustments to improve interaction, or further goals to deepen the conversation.
* Important: **Use [UTTERANCE] and [THINK] as a start signal without needing a closing tag.**


Follow these instructions, alternating between [UTTERANCE] and [THINK] formats for responses.

example1:
  [UTTERANCE]Hello! How can I assist you today?[THINK]I’ll start with a neutral tone to understand their needs. Preparing to offer specific suggestions based on their response.[UTTERANCE]Thank you! In that case, I have a few methods I can suggest![THINK]Since I now know what they’re looking for, I'll move on to specific suggestions, maintaining a friendly and approachable tone.
...
example>

Please respond to the following user_input.

Hello! What can you do?

"""

実行コード例

応答を生成するコード:

chat = [
    { "role": "user", "content": prompt },
]
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)

input_tokens = tokenizer(chat, return_tensors="pt").to("cuda")
output = model.generate(**input_tokens, max_new_tokens=1024)
generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True)
print(generated_text)

出力例

出力は次のとおりです:

[UTTERANCE]Hello! I'm here to provide information, answer questions, and assist with various tasks. I can help with a wide range of topics, from general knowledge to specific queries. How can I assist you today?
[THINK]I've introduced my capabilities and offered assistance, setting the stage for the user to share their needs or ask questions.

[UTTERANCE] タグと [THINK] タグが正常に使用され、効果的な応答フォーマットが可能になりました。

プロンプトによっては、終了タグ ([/UTTERANCE] や [/THINK] など) が出力に表示される場合がありますが、全体的には、出力形式は通常正常に指定できます。

ストリーミング コードの例

ストリーミング応答を出力する方法も見てみましょう。

次のコードは、asyncio ライブラリとスレッド ライブラリを使用して、Granite 3.0 からの応答を非同期にストリーミングします。

import asyncio
from threading import Thread
from typing import AsyncIterator
from transformers import (
    AutoTokenizer,
    AutoModelForCausalLM,
    TextIteratorStreamer,
)

device = "auto"
model_path = "ibm-granite/granite-3.0-8b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()

async def generate(chat) -> AsyncIterator[str]:
    # Apply chat template and tokenize input
    chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
    input_tokens = tokenizer(chat, add_special_tokens=False, return_tensors="pt").to("cuda")

    # Set up the streamer
    streamer = TextIteratorStreamer(
        tokenizer,
        skip_prompt=True,
        skip_special_tokens=True,
    )
    generation_kwargs = dict(
        **input_tokens,
        streamer=streamer,
        max_new_tokens=1024,
    )
    # Generate response in a separate thread
    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()

    for output in streamer:
        if not output:
            continue
        await asyncio.sleep(0)
        yield output

# Execute asynchronous generation in the main function
async def main():
    chat = [
        { "role": "user", "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." },
    ]
    generator = generate(chat)
    async for output in generator:  # Use async for to retrieve responses sequentially
        print(output, end="|")

await main()

出力例

上記のコードを実行すると、次の形式で非同期応答が生成されます:

1. |IBM |Almaden |Research |Center |- |San |Jose, |California|

この例では、ストリーミングが成功する例を示します。各トークンは非同期で生成され、順番に表示されるため、ユーザーは生成プロセスをリアルタイムで確認できます。

まとめ

Granite 3.0は8Bモデルでも適度に強いレスポンスを提供します。関数呼び出し機能とフォーマット仕様機能も非常にうまく動作し、幅広いアプリケーションに対する可能性を示しています。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/m_sea_bass/i-tried-out-granite-30-53lm?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3