忏悔: 首先,我根本不是这个领域的专家;我只是在工作中练习并尝试学习。另外,我很困惑这种模型是否不能在这种类型的 GPU 上运行。
我正在尝试在我的笔记本电脑上本地运行模型(目前,我只有这台机器)。 我已经从 Hungging Face The Bloke 下载了模型。
内涵: 我使用的是Langchain,我会上传一些数据并与模型进行对话(大致就是这样的想法,不幸的是,由于隐私问题我无法表达更多)。
到目前为止工作: 我首先使用了 llama-cpp-python (CPU) 库并尝试运行该模型,并且它有效。但正如预料的那样,推理速度太慢了,回答一题花了近2分钟。
然后我尝试使用以下命令使用 cuBLAS 进行构建:
!CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip install --upgrade llama-cpp-python
它成功了,运行程序后,我注意到 BLAS = 1(之前,在 CPU 版本中,BLAS = 0)。
问题: 运行整个程序后,我注意到,当我上传想要执行对话的数据时,模型没有加载到我的 GPU 上,我在查看 Nvidia X Server 后得到了它,它显示我的GPU 内存根本没有被消耗,尽管在终端中显示 BLAS = 1,而且我的想法是它并不表明模型已加载到 GPU 上。现在,我不知道此时该怎么办。我在互联网上搜索但没有得到任何适当的修复。
一些其他问题: 我尝试设置 n_batch = 256 而不是默认值 512,以减少 GPU 上的压力,但我收到错误 ValueError:请求的令牌超出了上下文窗口..。所以,我想知道如何权衡 GPU 层、上下文窗口和批量大小之间的关系?在LlamaCpp GPU的文档中,是这样写的:
我实际更改模型的项目的代码片段:
language_model = LlamaCpp(
model_path="/my/model/path/directory/sub_directory/mistral_7b_v_1/mistral-7b-v0.1.Q2_K.gguf",
n_gpu_layers=1,
n_batch=64,
n_ctx=256,
f16_kv=True,
callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),
verbose=True
)
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
return ConversationalRetrievalChain.from_llm(
llm=language_model,
retriever=vectorstore.as_retriever(search_type="mmr", search_kwargs = {"k": 5}),
memory=memory
)
硬件详细信息:
最后: 感谢您阅读这篇长文。如果可以的话,我期待着一些答案。 :)
改变
n_gpu_layers
参数慢慢增加,直到你的GPU内存耗尽。
将
n_gpu_layers
设置为 -1 会将所有层卸载到 GPU。
在加载模型时检查您的 llama-cpp 日志:
如果它们看起来像这样:
main: build = 722 (049aa16)
main: seed = 1
ggml_init_cublas: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 3090
llama.cpp: loading model from models/7B/ggml-model-q4_0.bin
llama_model_load_internal: format = ggjt v3 (latest)
llama_model_load_internal: n_vocab = 32000
llama_model_load_internal: n_ctx = 512
llama_model_load_internal: n_embd = 4096
llama_model_load_internal: n_mult = 256
llama_model_load_internal: n_head = 32
llama_model_load_internal: n_layer = 32
llama_model_load_internal: n_rot = 128
llama_model_load_internal: ftype = 2 (mostly Q4_0)
llama_model_load_internal: n_ff = 11008
llama_model_load_internal: n_parts = 1
llama_model_load_internal: model size = 7B
llama_model_load_internal: ggml ctx size = 0.07 MB
llama_model_load_internal: using CUDA for GPU acceleration
llama_model_load_internal: mem required = 5407.71 MB (+ 1026.00 MB per state)
llama_model_load_internal: offloading 0 repeating layers to GPU
llama_model_load_internal: **offloaded 0/35 layers to GPU**
llama_model_load_internal: total VRAM used: 512 MB
...................................................................................................
llama_init_from_file: kv self size = 256.00 MB
WARNING: failed to allocate 512.00 MB of pinned memory: out of memory
WARNING: failed to allocate 512.00 MB of pinned memory: out of memory
system_info: n_threads = 12 / 24 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | VSX = 0 |
sampling: repeat_last_n = 64, repeat_penalty = 1.100000, presence_penalty = 0.000000, frequency_penalty = 0.000000, top_k = 40, tfs_z = 1.000000, top_p = 0.950000, typical_p = 1.000000, temp = 0.800000, mirostat = 0, mirostat_lr = 0.100000, mirostat_ent = 5.000000
generate: n_ctx = 512, n_batch = 512, n_predict = 256, n_keep = 0
如果它说将 0 个重复层卸载到 GPU 或任何更低的数字,请尝试增加它。