在本機執行Breeze-7B-Instruct-v1_0

甚麼是Breeze-7B-Instruct-v1_0

huggingface頁面:https://huggingface.co/MediaTek-Research/Breeze-7B-Instruct-v1_0

線上DEMO: https://huggingface.co/spaces/MediaTek-Research/Demo-MR-Breeze-7B

聯發科的Breeze系列有好幾種不同的模型,在使用的時候要注意其微調順序

首先就是Breeze-7B-Base 是 Breeze-7B 系列的基礎模型。而Breeze-7B-Instruct 源自基礎模型 Breeze-7B-Base,使得最終模型可以直接用於常見任務。

Ollama library上的breeze模型總是使用簡體中文回答

我有嘗試使用Ollama在Library上面尋找別人訓練好的Library,但不太確定為什麼總是回答簡體中文,而無法好好使用繁體中文回應

https://ollama.com/search?q=breeze

我有嘗試過markliou/breeze-7bycchen/breeze-7b-instruct-v1_0jcai/breeze-7b-32k-instruct-v1_0

其中markliou/breeze-7b是回繁體中文沒錯但總是沒在理我問什麼,而剩的都用簡體中文

後來發現是問的問題的關係,以jcai/breeze-7b-instruct-v1_0為例,如果問的問題是台灣專屬的,那麼就會以繁體中文回覆,畢竟原本是以Mistral-7B-v0.1為基礎,如果後面的微調沒有微調到的資料,就仍會有簡體中文的出現,如果詢問台北有哪些地方好玩,則會都使用繁體中文

自己將Hugging Face上的檔案匯入Ollama

所以我嘗試使用下面的Makefile,並將https://huggingface.co/MediaTek-Research/Breeze-7B-Base-v1_0的檔案放置至同資料夾內

FROM mistral:v0.1
ADAPTER ./

然後用

ollama create my-breeze

中間有出了一些錯誤

panic: runtime error: index out of range [1] with length 1

這代表你的.safetensors 檔案的格式或內容不符合 ollama 轉換的要求。請檢查你所使用的 .safetensors 檔案是否與基礎模型匹配。例如我就是因為原本是使用Breeze-7B-Instruct,而基礎模型卻直接使用mistral:v0.1

Breeze-7B-Base-v1_0微調自:mistralai/Mistral-7B-v0.1

Breeze-7B-Instruct-v1_0 微調自:MediaTek-Research/Breeze-7B-Base-v1_0

所以我daapter用Breeze-7B-Instruct-v1_0,基礎模型卻使用mistral:v0.1,就會不行

後來有嘗試用正確的方式,仍然無法,原因是GPU不夠力

2024/10/03 01:22:18 routes.go:1153: INFO server config env=”map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:D:\ollama\models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]”
time=2024-10-03T01:22:18.347+08:00 level=INFO source=images.go:753 msg=”total blobs: 50″
time=2024-10-03T01:22:19.031+08:00 level=INFO source=images.go:760 msg=”total unused blobs removed: 1″
time=2024-10-03T01:22:19.034+08:00 level=INFO source=routes.go:1200 msg=”Listening on [::]:11434 (version 0.3.12)”
time=2024-10-03T01:22:19.035+08:00 level=INFO source=common.go:49 msg=”Dynamic LLM libraries” runners=”[cpu_avx cpu_avx2 cuda_v11 cuda_v12 rocm_v6.1 cpu]”
time=2024-10-03T01:22:19.035+08:00 level=INFO source=gpu.go:199 msg=”looking for compatible GPUs”
time=2024-10-03T01:22:19.247+08:00 level=INFO source=gpu.go:292 msg=”detected OS VRAM overhead” id=GPU-e7a02a5a-c5d7-954e-8c0c-1e61accd6933 library=cuda compute=8.6 driver=12.6 name=”NVIDIA GeForce RTX 3090″ overhead=”216.4 MiB”
time=2024-10-03T01:22:19.252+08:00 level=INFO source=types.go:107 msg=”inference compute” id=GPU-e7a02a5a-c5d7-954e-8c0c-1e61accd6933 library=cuda variant=v12 compute=8.6 driver=12.6 name=”NVIDIA GeForce RTX 3090″ total=”24.0 GiB” available=”22.8 GiB”
[GIN] 2024/10/03 – 01:22:40 | 200 | 0s | 127.0.0.1 | HEAD “/”
[GIN] 2024/10/03 – 01:23:35 | 201 | 23.5449467s | 127.0.0.1 | POST “/api/blobs/sha256:db70372fb06ef4ea5b51aca748a054c8cfadd0e966340da549100bcabca00513”
[GIN] 2024/10/03 – 01:23:35 | 200 | 12.2951ms | 127.0.0.1 | POST “/api/create”
[GIN] 2024/10/03 – 01:29:09 | 200 | 8.9953ms | 162.142.125.45 | GET “/”
[GIN] 2024/10/03 – 01:29:19 | 200 | 0s | 162.142.125.45 | GET “/”
[GIN] 2024/10/03 – 01:29:20 | 404 | 8.2049ms | 162.142.125.45 | GET “/favicon.ico”
[GIN] 2024/10/03 – 02:36:30 | 404 | 0s | 47.89.254.25 | GET “/v2/_catalog”
[GIN] 2024/10/03 – 02:36:55 | 200 | 0s | 123.160.223.72 | GET “/”
[GIN] 2024/10/03 – 02:36:55 | 404 | 0s | 123.160.223.74 | GET “/favicon.ico”
[GIN] 2024/10/03 – 05:38:15 | 200 | 0s | 172.168.40.190 | GET “/”
[GIN] 2024/10/03 – 09:13:49 | 200 | 0s | 127.0.0.1 | HEAD “/”
[GIN] 2024/10/03 – 09:13:49 | 200 | 4.2285ms | 127.0.0.1 | GET “/api/tags”
[GIN] 2024/10/03 – 09:15:16 | 200 | 0s | 127.0.0.1 | HEAD “/”
[GIN] 2024/10/03 – 09:15:45 | 200 | 531.8µs | 127.0.0.1 | POST “/api/blobs/sha256:db70372fb06ef4ea5b51aca748a054c8cfadd0e966340da549100bcabca00513”
[GIN] 2024/10/03 – 09:16:03 | 200 | 17.7737368s | 127.0.0.1 | POST “/api/create”
panic: runtime error: index out of range [1] with length 1

每次都會在那個超過100%的時機點壞掉,我想這也是為什麼Ollama上面的模型都有先經過量化(quantization)的原因

直接使用transformers呼叫推理

以下為程式碼

# Load model directly
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("MediaTek-Research/Breeze-7B-Instruct-v1_0")
model = AutoModelForCausalLM.from_pretrained("MediaTek-Research/Breeze-7B-Instruct-v1_0")
chat = [
  {"role": "user", "content": "你好,請問你可以完成什麼任務?"},
  {"role": "assistant", "content": "你好,我可以幫助您解決各種問題、提供資訊和協助您完成許多不同的任務。例如:回答技術問題、提供建議、翻譯文字、尋找資料或協助您安排行程等。請告訴我如何能幫助您。"},
  {"role": "user", "content": "太棒了!"},
]
tokenizer.apply_chat_template(chat, tokenize=False)
outputs = model.generate(tokenizer.apply_chat_template(chat, return_tensors="pt"),
                         # adjust below parameters if necessary 
                         max_new_tokens=128,
                         top_p=0.01,
                         top_k=85,
                         repetition_penalty=1.1,
                         temperature=0.01)
                         
print(tokenizer.decode(outputs[0]))

回覆則會是:【很高興能為您服務!如果有任何需要,歡迎隨時詢問。】

PS: 這種方式執行速度非常的慢


17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。