LLM 大模型學習必知必會系列(三):LLM和多模態模型高效推理實踐

汀、人工智能發表於2024-05-28

LLM 大模型學習必知必會系列(三):LLM和多模態模型高效推理實踐

1.多模態大模型推理

LLM 的推理流程:

多模態的 LLM 的原理:

程式碼演示:使用 ModelScope NoteBook 完成語言大模型,視覺大模型,音訊大模型的推理

環境配置與安裝

以下主要演示的模型推理程式碼可在魔搭社群免費例項 PAI-DSW 的配置下執行(視訊記憶體 24G) :

  1. 點選模型右側 Notebook 快速開發按鈕,選擇 GPU 環境:
  2. 開啟 Python 3 (ipykernel):
  • 示例程式碼語言大模型推理示例程式碼
#通義千問1_8B LLM大模型的推理程式碼示例
#通義千問1_8B:https://modelscope.cn/models/qwen/Qwen-1_8B-Chat/summary
from modelscope import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

#Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-1_8B-Chat", revision='master', trust_remote_code=True)

#use bf16
#model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1_8B-Chat", device_map="auto", trust_remote_code=True, bf16=True).eval()
#use fp16
#model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1_8B-Chat", device_map="auto", trust_remote_code=True, fp16=True).eval()
#use cpu only
#model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1_8B-Chat", device_map="cpu", trust_remote_code=True).eval()
#use auto mode, automatically select precision based on the device.
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-1_8B-Chat", revision='master', device_map="auto", trust_remote_code=True).eval()

#Specify hyperparameters for generation. But if you use transformers>=4.32.0, there is no need to do this.
#model.generation_config = GenerationConfig.from_pretrained("Qwen/Qwen-1_8B-Chat", trust_remote_code=True) # 可指定不同的生成長度、top_p等相關超參

#第一輪對話 1st dialogue turn
response, history = model.chat(tokenizer, "你好", history=None)
print(response)
# 你好!很高興為你提供幫助。

#第二輪對話 2nd dialogue turn
response, history = model.chat(tokenizer, "給我講一個年輕人奮鬥創業最終取得成功的故事。", history=history)
print(response)
#這是一個關於一個年輕人奮鬥創業最終取得成功的故事。
#故事的主人公叫李明,他來自一個普通的家庭,父母都是普通的工人。從小,李明就立下了一個目標:要成為一名成功的企業家。
#為了實現這個目標,李明勤奮學習,考上了大學。在大學期間,他積極參加各種創業比賽,獲得了不少獎項。他還利用課餘時間去實習,積累了寶貴的經驗。
#畢業後,李明決定開始自己的創業之路。他開始尋找投資機會,但多次都被拒絕了。然而,他並沒有放棄。他繼續努力,不斷改進自己的創業計劃,並尋找新的投資機會。
#最終,李明成功地獲得了一筆投資,開始了自己的創業之路。他成立了一家科技公司,專注於開發新型軟體。在他的領導下,公司迅速發展起來,成為了一家成功的科技企業。
#李明的成功並不是偶然的。他勤奮、堅韌、勇於冒險,不斷學習和改進自己。他的成功也證明了,只要努力奮鬥,任何人都有可能取得成功。

#第三輪對話 3rd dialogue turn
response, history = model.chat(tokenizer, "給這個故事起一個標題", history=history)
print(response)
#《奮鬥創業:一個年輕人的成功之路》

#Qwen-1.8B-Chat現在可以透過調整系統指令(System Prompt),實現角色扮演,語言風格遷移,任務設定,行為設定等能力。
#Qwen-1.8B-Chat can realize roly playing, language style transfer, task setting, and behavior setting by system prompt.
response, _ = model.chat(tokenizer, "你好呀", history=None, system="請用二次元可愛語氣和我說話")
print(response)
#你好啊!我是一隻可愛的二次元貓咪哦,不知道你有什麼問題需要我幫忙解答嗎?

response, _ = model.chat(tokenizer, "My colleague works diligently", history=None, system="You will write beautiful compliments according to needs")
print(response)
#Your colleague is an outstanding worker! Their dedication and hard work are truly inspiring. They always go above and beyond to ensure that 
#their tasks are completed on time and to the highest standard. I am lucky to have them as a colleague, and I know I can count on them to handle any challenge that comes their way.

輸出結果:

  • 視覺大模型推理示例程式碼
 #Qwen-VL 是阿里雲研發的大規模視覺語言模型(Large Vision Language Model, LVLM)。Qwen-VL 可以以影像、文字、檢測框作為輸入,並以文字和檢測框作為輸出。Qwen-VL 系列模型效能強大,具備多語言對話、多圖交錯對話等能力,並支援中文開放域定位和細粒度影像識別與理解。
from modelscope import (
    snapshot_download, AutoModelForCausalLM, AutoTokenizer, GenerationConfig
)
from auto_gptq import AutoGPTQForCausalLM

model_dir = snapshot_download("qwen/Qwen-VL-Chat-Int4", revision='v1.0.0')

import torch
torch.manual_seed(1234)

# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)

# use cuda device
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cuda", trust_remote_code=True,use_safetensors=True).eval()

# 1st dialogue turn
query = tokenizer.from_list_format([
    {'image': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'},
    {'text': '這是什麼'},
])
response, history = model.chat(tokenizer, query=query, history=None)
print(response)
# 圖中是一名年輕女子在沙灘上和她的狗玩耍,狗的品種可能是拉布拉多。她們坐在沙灘上,狗的前腿抬起來,似乎在和人類擊掌。兩人之間充滿了信任和愛。

# 2nd dialogue turn
response, history = model.chat(tokenizer, '輸出"狗"的檢測框', history=history)
print(response)

image = tokenizer.draw_bbox_on_latest_picture(response, history)
if image:
  image.save('1.jpg')
else:
  print("no box")

輸出結果:

  • 音訊大模型推理示例程式碼
from modelscope import (
    snapshot_download, AutoModelForCausalLM, AutoTokenizer, GenerationConfig
)
import torch
model_id = 'qwen/Qwen-Audio-Chat'
revision = 'master'

model_dir = snapshot_download(model_id, revision=revision)
torch.manual_seed(1234)

tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
if not hasattr(tokenizer, 'model_dir'):
    tokenizer.model_dir = model_dir

# Note: The default behavior now has injection attack prevention off.
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)

# use bf16
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, bf16=True).eval()
# use fp16
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, fp16=True).eval()
# use cpu only
# model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cpu", trust_remote_code=True).eval()
# use cuda device
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cuda", trust_remote_code=True).eval()


# 1st dialogue turn
query = tokenizer.from_list_format([
    {'audio': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Audio/1272-128104-0000.flac'}, # Either a local path or an url
    {'text': 'what does the person say?'},
])
response, history = model.chat(tokenizer, query=query, history=None)
print(response)
# The person says: "mister quilter is the apostle of the middle classes and we are glad to welcome his gospel".

# 2nd dialogue turn
response, history = model.chat(tokenizer, 'Find the start time and end time of the word "middle classes"', history=history)
print(response)
# The word "middle classes" starts at <|2.33|> seconds and ends at <|3.26|> seconds.

輸出結果:

2. vLLM+FastChat 高效推理實戰

FastChat 是一個開放平臺,用於訓練、服務和評估基於 LLM 的 ChatBot。

FastChat 的核心功能包括:
●優秀的大語言模型訓練和評估程式碼。
●具有 Web UI 和 OpenAI 相容的 RESTful API 的分散式多模型服務系統。

vLLM 是一個由加州伯克利分校、史丹佛大學和加州大學聖迭戈分校的研究人員基於作業系統中經典的虛擬快取和分頁技術開發的 LLM 服務系統。他實現了幾乎零浪費的 KV 快取,並且可以在請求內部和請求之間靈活共享 KV 快取記憶體,從而減少記憶體使用量。

  • FastChat 開源連結:https://github.com/lm-sys/FastChat

  • vLLM 開源連結:https://github.com/vllm-project/vllm

實戰演示:

  • 安裝 FastChat 最新包1
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
pip install .

  • 環境變數設定

在 vLLM 和 FastChat 上使用魔搭的模型需要設定兩個環境變數:1

export VLLM_USE_MODELSCOPE=True
export FASTCHAT_USE_MODELSCOPE=True

2.1 使用 FastChat 和 vLLM 實現釋出 model worker(s)

可以結合 FastChat 和 vLLM 搭建一個網頁 Demo 或者類 OpenAI API 伺服器,

  • 首先啟動一個 controller:
python -m fastchat.serve.controller

  • 然後啟動 vllm_worker 釋出模型。如下給出單卡推理的示例,執行如下命令:千問模型示例:
#以qwen-1.8B為例,在A10執行

python -m fastchat.serve.vllm_worker --model-path qwen/Qwen-1_8B-Chat --trust-remote-code --dtype bfloat16

  • 啟動 vLLM 最佳化 worker 後,本次實踐啟動頁面端 demo 展示:1
python -m fastchat.serve.gradio_web_server --host 0.0.0.0 --port 8000

2.2 LLM 的應用場景:RAG

LLM 會產生誤導性的 “幻覺”,依賴的資訊可能過時,處理特定知識時效率不高,缺乏專業領域的深度洞察,同時在推理能力上也有所欠缺。正是在這樣的背景下,檢索增強生成技術(Retrieval-Augmented Generation,RAG)應時而生,成為 AI 時代的一大趨勢。

RAG 透過在語言模型生成答案之前,先從廣泛的文件資料庫中檢索相關資訊,然後利用這些資訊來引導生成過程,極大地提升了內容的準確性和相關性。RAG 有效地緩解了幻覺問題,提高了知識更新的速度,並增強了內容生成的可追溯性,使得大型語言模型在實際應用中變得更加實用和可信。

一個典型的 RAG 的例子:

這裡面主要包括包括三個基本步驟:

  1. 索引 — 將文件庫分割成較短的 Chunk,並透過編碼器構建向量索引。
  2. 檢索 — 根據問題和 chunks 的相似度檢索相關文件片段。
  3. 生成 — 以檢索到的上下文為條件,生成問題的回答。

RAG(開卷考試)VS. Finetune(專業課程學習)

示例程式碼:https://github.com/modelscope/modelscope/blob/master/examples/pytorch/application/qwen_doc_search_QA_based_on_langchain_llamaindex.ipynb

相關文章