"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Experimentei Granito.

Experimentei Granito.

Publicado em 2024-11-08
Navegar:463

I tried out Granite .

Granito 3.0

Granite 3.0 é uma família leve e de código aberto de modelos de linguagem generativa projetados para uma variedade de tarefas de nível empresarial. Ele suporta nativamente funcionalidade multilíngue, codificação, raciocínio e uso de ferramentas, tornando-o adequado para ambientes corporativos.

Testei a execução deste modelo para ver quais tarefas ele pode realizar.

Configuração do ambiente

Configurei o ambiente Granite 3.0 no Google Colab e instalei as bibliotecas necessárias usando os seguintes comandos:

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

Execução

Testei o desempenho dos modelos 2B e 8B do Granite 3.0.

Modelo 2B

Executei o modelo 2B. Aqui está o exemplo de código para o modelo 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])

Saída

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

Modelo 8B

O modelo 8B pode ser usado substituindo 2b por 8b. Aqui está um exemplo de código sem função e campos de entrada do usuário para o modelo 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)

Saída

1. IBM Almaden Research Center - San Jose, California

Chamada de função

Eu explorei o recurso Function Calling, testando-o com uma função fictícia. Aqui, get_current_weather é definido para retornar dados meteorológicos simulados.

Função fictícia

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"}

Criação imediata

Criei um prompt para chamar a função:

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 }
]

Geração de Resposta

Usando o código a seguir, gerei uma resposta:

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)

Saída

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

Isso confirmou a capacidade do modelo de gerar a chamada de função correta com base na cidade especificada.

Especificação de formato para fluxo de interação aprimorado

Granite 3.0 permite a especificação de formato para facilitar respostas em formatos estruturados. Esta seção explica o uso de [UTTERANCE] para respostas e [THINK] para pensamentos internos.

Por outro lado, como a chamada de função é produzida como texto simples, pode ser necessário implementar um mecanismo separado para distinguir entre chamadas de função e respostas de texto regulares.

Especificando o formato de saída

Aqui está um exemplo de prompt para orientar o resultado da IA:

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?

"""

Exemplo de código de execução

o código para gerar uma resposta:

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)

Exemplo de saída

A saída é a seguinte:

[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.

As tags [UTTERANCE] e [THINK] foram usadas com sucesso, permitindo uma formatação de resposta eficaz.

Dependendo do prompt, tags de fechamento (como [/UTTERANCE] ou [/THINK]) podem às vezes aparecer na saída, mas no geral, o formato de saída geralmente pode ser especificado com sucesso.

Exemplo de código de streaming

Vejamos também como gerar respostas de streaming.

O código a seguir usa as bibliotecas asyncio e threading para transmitir respostas assíncronas do 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()

Exemplo de saída

A execução do código acima gerará respostas assíncronas no seguinte formato:

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

Este exemplo demonstra um streaming bem-sucedido. Cada token é gerado de forma assíncrona e exibido sequencialmente, permitindo aos usuários visualizar o processo de geração em tempo real.

Resumo

Granite 3.0 fornece respostas razoavelmente fortes mesmo com o modelo 8B. Os recursos de chamada de função e especificação de formato também funcionam muito bem, indicando seu potencial para uma ampla gama de aplicações.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/m_sea_bass/i-tried-out-granite-30-53lm?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3