"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > انا جربت الجرانيت

انا جربت الجرانيت

تم النشر بتاريخ 2024-11-08
تصفح:672

I tried out Granite .

الجرانيت 3.0

Granite 3.0 عبارة عن عائلة مفتوحة المصدر وخفيفة الوزن من نماذج اللغات التوليدية المصممة لمجموعة من المهام على مستوى المؤسسة. وهو يدعم أصلاً وظائف متعددة اللغات، والترميز، والتفكير، واستخدام الأدوات، مما يجعله مناسبًا لبيئات المؤسسات.

لقد اختبرت تشغيل هذا النموذج لمعرفة المهام التي يمكنه التعامل معها.

إعداد البيئة

لقد قمت بإعداد بيئة Granite 3.0 في Google Colab وقمت بتثبيت المكتبات اللازمة باستخدام الأوامر التالية:

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

تنفيذ

لقد قمت باختبار أداء كلا الطرازين 2B و8B من Granite 3.0.

نموذج 2 ب

قمت بتشغيل نموذج 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

نموذج 8 ب

يمكن استخدام النموذج 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 بمواصفات التنسيق لتسهيل الاستجابات في التنسيقات المنظمة. يشرح هذا القسم استخدام [النطق] للاستجابات و[التفكير] للأفكار الداخلية.

من ناحية أخرى، نظرًا لأن استدعاء الوظائف يتم إخراجه كنص عادي، فقد يكون من الضروري تنفيذ آلية منفصلة للتمييز بين استدعاءات الوظائف والاستجابات النصية العادية.

تحديد تنسيق الإخراج

إليك نموذج موجه لتوجيه مخرجات الذكاء الاصطناعي:

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]) في الإخراج، ولكن بشكل عام، يمكن تحديد تنسيق الإخراج بشكل عام بنجاح.

مثال على رمز البث

دعونا نلقي نظرة أيضًا على كيفية إخراج استجابات البث.

يستخدم التعليمة البرمجية التالية مكتبات المزامنة والترابط لدفق الاستجابات بشكل غير متزامن من 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