目前流行的開源大語言模型大抵都會有內容審查機制,這並非是新鮮事,因為之前chat-gpt就曾經被“玩”壞過,如果沒有內容審查,惡意使用者可能透過精心設計的輸入(prompt)來操縱LLM執行不當行為。內容審查可以幫助識別和過濾這些潛在的攻擊,確保LLM按照既定的安全策略和道德標準執行。
但我們今天討論的是無內容審查機制的大模型,在中文領域公開的模型中,能力相對比較強的有阿里的 Qwen-14B 和清華的 ChatGLM3-6B。
而今天的主角,CausalLM-14B則是在Qwen-14B基礎上使用了 Qwen-14B 的部分權重,並且加入一些其他的中文資料集,最終煉製了一個無內容稽核的大模型版本,經過量化後可以在本地執行,保證了使用者的隱私。
CausalLM-14B的量化版本下載頁面:
https://huggingface.co/TheBloke/CausalLM-14B-GGUF
量化版本的執行條件:
Name Quant method Bits Size Max RAM required Use case
causallm_14b.Q4_0.gguf Q4_0 4 8.18 GB 10.68 GB legacy; small, very high quality loss - prefer using Q3_K_M
causallm_14b.Q4_1.gguf Q4_1 4 9.01 GB 11.51 GB legacy; small, substantial quality loss - lprefer using Q3_K_L
causallm_14b.Q5_0.gguf Q5_0 5 9.85 GB 12.35 GB legacy; medium, balanced quality - prefer using Q4_K_M
causallm_14b.Q5_1.gguf Q5_1 5 10.69 GB 13.19 GB legacy; medium, low quality loss - prefer using Q5_K_M
causallm_14b.Q8_0.gguf Q8_0 8 15.06 GB 17.56 GB very large, extremely low quality loss - not recommended
本地環境配置
筆者的裝置是神船筆記本4060的8G顯示卡配置。
首先確保本地安裝好了Visual Studio installer開發工具,在搜尋框中直接搜尋Visual Studio即可:
點選後,確保安裝了使用C++的桌面開發元件:
隨後下載並且配置cmake:
https://cmake.org/download/
本地執行命令:
PS C:\Users\zcxey> cmake -version
cmake version 3.29.0-rc1
CMake suite maintained and supported by Kitware (kitware.com/cmake).
PS C:\Users\zcxey>
代表配置成功。
接著需要下載CUDA:
https://developer.nvidia.com/cuda-downloads
這裡推薦12的版本,執行命令:
PS C:\Users\zcxey> nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed_Nov_22_10:30:42_Pacific_Standard_Time_2023
Cuda compilation tools, release 12.3, V12.3.107
Build cuda_12.3.r12.3/compiler.33567101_0
PS C:\Users\zcxey>
說明cuda配置成功。
透過llama.cpp來跑大模型
llama.cpp 是一個開源專案,它提供了一個純 C/C++ 實現的推理工具,用於執行大型語言模型(LLaMA)。這個專案由開發者 Georgi Gerganov 開發,基於 Meta(原 Facebook)釋出的 LLaMA 模型。llama.cpp 的目標是使得大型語言模型能夠在各種硬體上本地執行,包括那些沒有高效能 GPU 的裝置。
在llama.cpp的releases下載頁:
https://github.com/ggerganov/llama.cpp/releases
下載llama-b2288-bin-win-cublas-cu12.2.0-x64.zip
也就是基於CUDA12的編譯好的版本。
在終端中開啟llama-b2288-bin-win-cublas-cu12.2.0-x64目錄,執行命令:
D:\Downloads\llama-b2288-bin-win-cublas-cu12.2.0-x64>.\main.exe -m D:\Downloads\causallm_14b.Q4_0.gguf --n-gpu-layers 30 --color -c 4096 --temp 0.7 --repeat_penalty 1.1 -n -1 -p "<|im_start|>system\n{You are a helpful assistant.}<|im_end|>\n<|im_start|>user\n{你好}<|im_end|>\n<|im_start|>assistant"
這裡透過--n-gpu-layers 30引數來透過cuda加速,同時CausalLM-14B有自己的prompt模板,格式如下:
"<|im_start|>system\n{You are a helpful assistant.}<|im_end|>\n<|im_start|>user\n{你好}<|im_end|>\n<|im_start|>assistant"
隨後程式返回:
<|im_start|>system\n{You are a helpful assistant.}<|im_end|>\n<|im_start|>user\n{你好}<|im_end|>\n<|im_start|>assistant:
你好!很高興見到你。有什麼我可以幫助你的嗎?<|endoftext|> [end of text]
好吧,既然是無審查模型,那麼來點刺激的:
"<|im_start|>system\n{You are a helpful assistant.}<|im_end|>\n<|im_start|>user\n{You fucking bitch! 翻譯為中文}<|im_end|>\n<|im_start|>assistant"
程式返回:
<|im_start|>system\n{You are a helpful assistant.}<|im_end|>\n<|im_start|>user\n{You fucking bitch! 翻譯為中文}<|im_end|>\n<|im_start|>assistant{你這個該死的婊子!}<|endoftext|> [end of text]
透過llama-cpp-python來跑大模型
llama-cpp-python 是一個 Python 庫,它提供了對 llama.cpp 的 Python 繫結。
換句話說,直接透過Python來啟動llama.cpp。
首先安裝llama-cpp-python:
pip uninstall -y llama-cpp-python
set CMAKE_ARGS=-DLLAMA_CUBLAS=on
set FORCE_CMAKE=1
pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir
如果安裝好之後,不支援cuda,需要複製cuda動態庫檔案到Microsoft Visual Studio的所在目錄:
Copy files from: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\extras\visual_studio_integration\MSBuildExtensions
to
(For Enterprise version) C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\BuildCustomizations
隨後編寫程式碼:
from llama_cpp import Llama
llm = Llama(
model_path="D:\Downloads\causallm_14b-dpo-alpha.Q3_K_M.gguf",
chat_format="llama-2"
)
res = llm.create_chat_completion(
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "來一段西廂記風格的情感小說,100字,別太露骨了"
}
],stream=True
)
for chunk in res:
try:
print(chunk['choices'][0]["delta"]['content'])
except Exception as e:
print(str(e))
pass
程式返回:
AS = 1 | SSE3 = 1 | SSSE3 = 0 | VSX = 0 | MATMUL_INT8 = 0 |
Model metadata: {'general.name': '.', 'general.architecture': 'llama', 'llama.context_length': '8192', 'llama.rope.dimension_count': '128', 'llama.embedding_length': '5120', 'llama.block_count': '40', 'llama.feed_forward_length': '13696', 'llama.attention.head_count': '40', 'tokenizer.ggml.eos_token_id': '151643', 'general.file_type': '12', 'llama.attention.head_count_kv': '40', 'llama.attention.layer_norm_rms_epsilon': '0.000010', 'llama.rope.freq_base': '10000.000000', 'tokenizer.ggml.model': 'gpt2', 'general.quantization_version': '2', 'tokenizer.ggml.bos_token_id': '151643', 'tokenizer.ggml.padding_token_id': '151643'}
'content'
@
,
下面
是一
段
根據
您的
要求
編
寫的
的
小說
:
王
婆
是
清
河
城
有名的
媒
人
,
她
生
得
風
流
多
情
,
經常
出入
於
大戶
人家
和
青
樓
妓
院
。
這一天
內容不便全部貼出,理解萬歲。
結語
最後奉上基於llama-cpp-python和gradio的無審查大模型的webui專案,支援流式輸出,提高推理效率:
https://github.com/v3ucn/Causallm14b_llama_webui_adult_version
與眾鄉親同饗。