」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我嘗試過花崗岩。

我嘗試過花崗岩。

發佈於2024-11-08
瀏覽:503

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型号

将2b替换为8b即可使用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|

此示例演示了成功的流式传输。每个token都是异步生成并顺序显示,让用户可以实时查看生成过程。

概括

Granite 3.0 即使使用 8B 型号也能提供相当强的响应。函数调用和格式规范功能也运行良好,表明其具有广泛的应用潜力。

版本聲明 本文轉載於:https://dev.to/m_sea_bass/i-tried-out-granite-30-53lm?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 使用攔截器自訂獲取並在 nuxt 3 中登錄
    使用攔截器自訂獲取並在 nuxt 3 中登錄
    如果您使用過 Nuxt,您可能遇到過方便的 useFetch 可組合項目: <script setup lang="ts"> const { data, status, error, refresh, clear } = await useFetch('/api/modules') &l...
    程式設計 發佈於2024-11-08
  • React原始碼中MessageChannel的使用
    React原始碼中MessageChannel的使用
    這篇文章我們分析React原始碼中MessageChannel的用法。 我們先來了解什麼是MessageChannel。 訊息頻道 Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort...
    程式設計 發佈於2024-11-08
  • 如何在 CSS 中縮排後續換行標籤行?
    如何在 CSS 中縮排後續換行標籤行?
    縮排換行標籤文字的後續行當面臨表單寬度的限制時,標籤文字可以換行到多行,從而美觀的擔憂。雖然第一行由於輸入元素的存在而縮進,但後續行可能不會縮進,從而產生不均勻的外觀。 要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:將輸入...
    程式設計 發佈於2024-11-08
  • 如何在CSS中模糊背景影像而不模糊內容?
    如何在CSS中模糊背景影像而不模糊內容?
    CSS 在保持內容清晰度的同時對背景圖像進行模糊處理嘗試在CSS 設定中模糊背景圖像時,通常會遇到內容(文字或其他元素)也變得模糊的問題。這就是 z-index 和偽元素的概念發揮作用的地方。 要模糊背景圖像而不影響內容,可以採用以下方法:創建背景容器:將背景圖像包含在div或其他容器中並為其分配一...
    程式設計 發佈於2024-11-08
  • 啞的
    啞的
    大家好,我是Misti-sage,DOOF的唯一創造者: 動態的 輸出 針對進行了最佳化 靈活性。 (我是編碼新手,所以我的大部分(如果不是全部)DOOF 工作都是由 ChatGPT 協助的。) 我歡迎任何可以幫助改進 DOOF(也稱為 Darfensmirg)的人。 <!DOCTYPE ...
    程式設計 發佈於2024-11-08
  • 為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?
    為什麼 Go 正規表示式 \\b 邊界對於拉丁字元會失敗?
    \b Go 正規表示式中拉丁文字元的邊界在Go 正規表示式的世界中, \b 邊界選項有一個輕微的怪癖處理拉丁字符時。當嘗試定義包含拉丁字元(例如重音元音和特殊字元)的單字時,就會出現此問題。 考慮以下範例,我們希望使用 \b 邊界選項來匹配單字「vis」:import ( "fmt...
    程式設計 發佈於2024-11-08
  • Node.js 中與 WebSockets 和 Socket.IO 的即時通信
    Node.js 中與 WebSockets 和 Socket.IO 的即時通信
    现代 Web 应用程序通常需要实时通信,无论是聊天系统、实时更新、协作编辑还是通知。传统的 HTTP 通信不足以满足实时应用程序的需要,因为它依赖于请求-响应模式。这就是 WebSockets 发挥作用的地方,它允许服务器和客户端之间进行全双工通信。 在本文中,我们将探讨: WebSocket 是什...
    程式設計 發佈於2024-11-08
  • H2 與 HSQLDB:哪種嵌入式資料庫最適合我的財務管理應用程式?
    H2 與 HSQLDB:哪種嵌入式資料庫最適合我的財務管理應用程式?
    Java 嵌入式資料庫比較鑑於有大量可用選項,為您的財務管理應用程式選擇嵌入式資料庫可能具有挑戰性。為了幫助您,讓我們根據您的需求比較 H2、HSQLDB、Derby 和 Berkeley DB。 H2 與 HSQLDBH2 和 HSQLDB 都提供出色的效能和穩定性。 H2以速度著稱,而HSQLD...
    程式設計 發佈於2024-11-08
  • C 中允許多少級指標間接定址?
    C 中允許多少級指標間接定址?
    C 語言中的指標深度:了解層級限制在 C 程式設計中,變數可以使用指標具有多層間接尋址。這種靈活性允許複雜的資料結構和高效的記憶體管理。然而,問題出現了:單一變數允許的最大指標等級(稱為“*”)是多少? 了解指針深度的限制對於有效和安全的編程至關重要。 C 標準定義了允許的指標等級數的下限,但上限是...
    程式設計 發佈於2024-11-08
  • CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 防止的錯誤:「Access-Control-Allow-Origin 不允許來源」簡介:跨來源資源共享(CORS) 期間,當用戶端腳本嘗試從與其運行來源不同的來源存取資源。 原因:此錯誤有幾個潛在原因: 同源策略:未經伺服器明確許可, JavaScript 被限制存取其網域之外的資源。此策...
    程式設計 發佈於2024-11-08
  • 光澤和微光讓我的心率下降 - 案例研究
    光澤和微光讓我的心率下降 - 案例研究
    最近,一位客戶聯繫我,詢問其 WordPress 網站上的「財務評估」javascript 應用程式不再運作。它有很多問題,最後,最簡單的方法就是重建它。 在此應用程式中,使用者可以輸入基本的財務和個人訊息,應用程式會告訴他們在財務規劃方面是否走在正確的道路上。這不是超級複雜的邏輯,但有相當多的邏...
    程式設計 發佈於2024-11-08
  • 案例研究:加權九尾問題
    案例研究:加權九尾問題
    加權九尾問題可以簡化為加權最短路徑問題。 部分提出了九尾問題並使用 BFS 演算法解決了它。本節介紹問題的變體並使用最短路徑演算法解決它。 九尾問題是找出導致所有硬幣面朝下的最少移動次數。每一步都會翻轉一枚正面硬幣及其相鄰硬幣。加權九尾問題將翻轉次數指定為每次移動的權重。例如,您可以透過翻轉第一...
    程式設計 發佈於2024-11-08
  • 如何使用 document.querySelectorAll 正確循環選定的元素?
    如何使用 document.querySelectorAll 正確循環選定的元素?
    使用 document.querySelectorAll 循環選定的元素在 Web 開發中,循環選定的元素通常是必要的。 document.querySelectorAll 提供了一個表示所選元素的類似陣列的物件。但是,如果直接在 NodeList 上執行迭代,可能會出現問題,導致輸出中出現其他項目...
    程式設計 發佈於2024-11-08
  • 變數和資料夾的命名規則是什麼?
    變數和資料夾的命名規則是什麼?
    การตั้งชื่อสำหรับตัวแปรและโฟลเดอร์ในโปรเจกต์มีความสำคัญมากในการรักษาความอ่านง่ายและความเป็นระเบียบของโค้ด ต่อไปนี้คือลักษณะและกฎทั่วไปในการตั้งชื่อ: ...
    程式設計 發佈於2024-11-08
  • 使用 Python 建立測驗應用程式:逐步指南
    使用 Python 建立測驗應用程式:逐步指南
    您是否曾想创建自己的测验应用程序?这是一个有趣的项目,可以帮助您学习编程,同时也可以创造一些有用的东西。在此项目中,我们将逐步介绍如何构建一个包含多项选择题、评分、时间限制和不同主题的简单测验应用程序。 我们的测验应用程序会做什么 我们的测验应用程序将: 提出多项选择题 记录分数 ...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3