RedHat-Build-LLM

如何在 Linux 服务器上搭建本地LLMs (RedHat 篇)🤔

最近因为一些原因,需要在一台 RedHat 红帽机器上配置一个 qwen2-7B 模型来进行离线大模型的使用。过程非常曲折,特此记录本次过程。

拿到服务器账号之后,我先检查了一些环境配置,个人用户缺失很多环境,好消息是 root 用户可以使用 nvcc 命令。那么我们就可以不用费劲去安装 cuda 了。

那么我首先使用个人用户安装了 Anaconda。安装过程如下:

安装完成后,配置环境变量,创建虚拟环境(这里我使用的 Python 版本是我参考的组卡平台的版本,这个版本经过测试不存在什么问题)。

1
conda create -n qwen2 python=3.10.12

启动虚拟环境时可能会遇到问题:

① 出现错误:CondaError: Run 'conda init' before 'conda activate'

② 换源问题

然后我继续向下推进:

我们切换到 qwen2 环境,正常安装相应的 modelscope 软件包。

1
pip install modelscope

目前为止一切顺利。我们需要使用 git 命令将 llama.cpp 拉到本地,因为这个服务器无法访问 GitHub,这里我们可以使用 Gitee 来进行替代。使用 Gitee 可以将 GitHub 上的仓库拉取下来:

GiteePullGithub GiteePullGithub GiteePullGithub

然后对于 Gitee 中的文件,我们使用 wget 命令下载即可。

更新 GCC

⭐⭐Linux升级gcc到最新版本gcc-11.2.0_更新gcc-CSDN博客

⭐⭐⭐Linux gcc升级全过程,过程超详细-阿里云开发者社区 (aliyun.com)

安装 Ccache

  1. 从官方网站下载 CcacheCcache — Compiler cache,我们也可以从 GitHubReleases 页面上找到较旧的版本。

  2. 使用 tar -zxvf ccache-<VERSION>-linux-x86_64.tar.xz 命令,解压 Ccache 到文件夹

  3. 较早的版本需要执行三条语句进行安装

    1
    2
    3
    ./configure
    make
    sudo make install
  4. 较新的版本提供了一键安装方式

    1
    2
    # 一般为 /usr/local/ccache-your-version_num
    make install prefix=/usr/local/ccache-4.9
  5. 配置环境变量

  6. 检查 Ccache 的版本

    1
    ccache -V

安装 MPFRGMP

安装 MPC

  1. 官网:Download — multiprecision.org

问题:

error while loading shared libraries: libmpfr.so.6: cannot open shared object file: No such file or directory 安装 libmpfr6-4.1.0-alt1.x86_64.rpm 并且将缺少的库放到 /usr/lib64 中。

下载地址:libmpfr6-4.1.0-alt1.x86_64.rpm ALT Linux P10 Download (pkgs.org)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost gcc_bag]# wget https://altlinux.pkgs.org/sisyphus/classic-x86_64/libmpfr6-4.1.0-alt2.x86_64.rpm.html
[root@localhost gcc_bag]# ls
libmpfr6-4.1.0-alt2.x86_64.rpm
[root@localhost gcc_bag]# rpm2cpio libmpfr6-4.1.0-alt2.x86_64.rpm | cpio -div

[root@localhost gcc_bag]# rpm2cpio libmpfr6-4.1.0-alt2.x86_64.rpm | cpio -div
./usr/lib64/libmpfr.so.6
./usr/lib64/libmpfr.so.6.1.0
./usr/share/doc/mpfr-4.1.0
./usr/share/doc/mpfr-4.1.0/AUTHORS
./usr/share/doc/mpfr-4.1.0/BUGS
./usr/share/doc/mpfr-4.1.0/NEWS
5494 blocks

[root@localhost gcc_bag]# ls
libmpfr6-4.1.0-alt2.x86_64.rpm usr

[root@localhost gcc_bag]# mv ./usr/lib64/libmpfr.so.6 /usr/lib64/
[root@localhost gcc_bag]# mv ./usr/lib64/libmpfr.so.6.1.0 /usr/lib64/

更新 binutils,包括 ldas

binutils 镜像:Index of /gnu/binutils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost Share]# wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2  
//wget如果下载不下来就 直接浏览器访问网址下载后再解压
[root@localhost Share]# tar -xjf binutils-2.25.1.tar.bz2
[root@localhost Share]# cd binutils-2.25.1
[root@localhost binutils-2.25.1]# ./configure --prefix=/usr
[root@localhost binutils-2.25.1]# make
[root@localhost binutils-2.25.1]# make install
//安装完毕验证结果
[root@localhost binutils-2.25.1]# as --version
GNU assembler (GNU Binutils) 2.25.1
[root@localhost binutils-2.25.1]# objdump -v
GNU objdump (GNU Binutils) 2.25.1
[root@localhost binutils-2.25.1]# ld -v
GNU ld (GNU Binutils) 2.25.1

安装 nvcc

https://blog.csdn.net/bigbaojian/article/details/129642388

Linux 下的 CUDA 安装和使用指南 - 知乎 (zhihu.com)

Deploy_LLMs_ON_Linux

如何在 Linux 服务器上搭建本地LLMs 🤔

如何在 Linux 服务器上部署大语言模型,以 qwen1_5-32b-chat-q8_k_0 为例。服务器使用显卡 A4000,预算:$5950$ 元。

搭建 qwen1_5-32b-chat-q8_k_0

  1. 下载 🤗Hugging Face 库,这个库主要是用于下载模型使用。当然为了保证速度,我们可以使用 wget 命令替代他。如果你决定使用 wget 命令,你可以选择跳过这一步,具体的使用方式在第五步呈现。

    1
    (base) ➜  ~ pip install huggingface_hub

    或者是直接下载 modelscope 库,使用 modelscope 下载模型(⭐推荐)。

    1
    (base) ➜  ~ pip install modelscope
  2. 创建一个 LocalGit 文件夹,并进入该文件夹

    1
    2
    3
    (base) ➜  ~ mkdir LocalGit
    (base) ➜ ~ cd LocalGit
    (base) ➜ LocalGit
  3. 克隆 llama.cpp 的仓库

    1
    2
    3
    (base) ➜  LocalGit git clone https://github.com/ggerganov/llama.cpp
    (base) ➜ LocalGit cd llama.cpp
    (base) ➜ llama.cpp git:(master)
  4. 在有 GPU 的环境下编译 llama.cpp

    前置条件:安装 nvcc + cmake

    执行代码进行编译:

    1
    (base) ➜  llama.cpp git:(master) make LLAMA_CUBLAS=1 LLAMA_CUDA_NVCC=/usr/local/cuda/bin/nvcc

    如果出现错误:(base) ➜ llama.cpp git:(master) make LLAMA_CUBLAS=1 LLAMA_CUDA_NVCC=/usr/local/cuda/bin/nvcc Makefile:76: *** LLAMA_CUBLAS is removed. Use GGML_CUDA instead.. Stop.

    修改代码如下:

    1
    (base) ➜  llama.cpp git:(master) make GGML_CUDA=1 LLAMA_CUDA_NVCC=/usr/local/cuda/bin/nvcc

    为了加快编译速度,我们可以尝试以下命令添加参数 jj 后面的数字表示同时编译的线程数(可根据 CPU 核数决定),实测能缩短约 $1/3$ 的时间:

    1
    (base) ➜  llama.cpp git:(master) make -j6 GGML_CUDA=1 LLAMA_CUDA_NVCC=/usr/local/cuda/bin/nvcc
  5. 下载相应的模型

    ① 使用 Hugging Face 下载相应模型,实测服务器网速在 3M~6M 左右,具体方式如下:

    1
    (base) ➜  ~ huggingface-cli download Qwen/Qwen1.5-32B-Chat-GGUF qwen1_5-32b-chat-q8_0.gguf --local-dir . --local-dir-use-symlinks False

    ② 使用 wget 下载 modelscope 的模型文件,实测网速在 10M~22M 左右,这需要你先获取到模型的下载链接,具体方式如下:

    1
    (base) ➜  ~ wget https://www.modelscope.cn/models/qwen/Qwen1.5-32B-Chat-GGUF/resolve/master/qwen1_5-32b-chat-q8_0.gguf

    ③ 直接使用 modelscope 库下载模型,实测网速在 18M~65M 左右,具体方式如下:

    1
    2
    3
    4
    (base) ➜  ~ cd LocalGit 
    (base) ➜ LocalGit mkdir models
    (base) ➜ LocalGit cd models
    (base) ➜ models modelscope download --model=qwen/Qwen2-7B-Instruct-GGUF --local_dir . qwen2-7b-instruct-q8_0.gguf
  6. 使用 llama.cpp 的相关命令进行操作

    1
    (base) ➜  llama.cpp git:(master) ./main -m ../models/qwen1_5-32b-chat-q8_0.gguf -n 512 --color -i -cml -f prompts/chat-with-qwen.txt
    1
    (base) ➜  llama.cpp git:(master) ./llama-server -m ../models/qwen1_5-32b-chat-q8_0.gguf -ngl 80 -fa

    如果是 Qwen2-7B-Instruct-GGUF,可以参考官方文档:Qwen2-7B-Instruct-GGUF · 模型库 — Qwen2-7B-Instruct-GGUF · 模型库 (modelscope.cn)

    1
    (base) ➜  llama.cpp git:(master) ./llama-server -m ../models/qwen2-7b-instruct-q8_0.gguf -ngl 29 -fa
  7. 兼容 OpenAI API,使用 Python 代码测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import openai

    client = openai.OpenAI(
    base_url="http://localhost:8080/v1", # "http://<Your api-server IP>:port"
    api_key = "sk-no-key-required"
    )

    completion = client.chat.completions.create(
    model="qwen",
    messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "tell me something about michael jordan"}
    ]
    )
    print(completion.choices[0].message.content)
  8. 命令启动

    1
    2
    3
    4
    5
    ./llama-cli -m qwen2-7b-instruct-q5_k_m.gguf \
    -n 512 -co -i -if -f prompts/chat-with-qwen.txt \
    --in-prefix "<|im_start|>user\n" \
    --in-suffix "<|im_end|>\n<|im_start|>assistant\n" \
    -ngl 24 -fa

拓展补充

Llama.cpp大模型量化简明手册_llamacpp量化-CSDN博客

【Llama2 windows部署详细教程】第二节:llama.cpp成功在windows上编译的秘诀_llama cpp 编译-CSDN博客

Windows Build llama.cpp

Windows 平台下构建 llama.cpp

在使用 LM-Studio 时,对于一些参数量不是很大的模型来说,大多数不需要进行模型的合并,如 qwen2-7b 等。这些模型往往只需要下载后加载到 LM-Studio 中即可。

但是对于参数量很大的模型,如 qwen2-72b-instruct 等,因为模型文件较大不利于传输,因此模型开发者可能会使用 llama.cppGGUF 模型进行拆分,所以这个时候我们在下载模型时就需要进行模型的合并。

qwen2-72b-instructq8 量化给出了两个模型文件,分别是:

1
2
qwen2-72b-instruct-q8_k_m-00001-of-00002.gguf
qwen2-72b-instruct-q8_k_m-00002-of-00002.gguf

为了使用这些分割后的 GGUF 文件,我们可以使用 llama-gguf-split 合并他们

1
llama-gguf-spilt --merge input.gguf output.gguf

Deploy_LLMs_ON_PC

如何搭建运行在本地的 LLMs 🤔

[TOC]

🤗 1. 基于 LM-Studio

  1. 访问 LM-Studio,网址:LM Studio - Discover, download, and run local LLMs

    下载对应系统的安装包,然后双击运行即可。

  1. 访问 ModelScope魔搭社区 或者 🤗Hugging FaceHugging Face,这里以 ModelScope 为例,进入模型库,下载相应模型。
魔搭社区官网
找到需要的模型并下载
  1. 下载好响应的模型后,将模型组织好,放到相应的文件夹中,这里按照 models/Publisher/Repository/*.gguf 的路径组织模型路径,然后选择 Change 更改模型的位置。如果不按照该路径组织,则会出现 You have 1 uncategorized model files. 错误,如下图所示:
  1. 但是那种方式是不太推荐的,我们组织 USER/MODEL_NAME/*.gguf 的结构,这种结构会比较明了:
  1. 完成模型文件的下载和组织后,我们可以进入聊天页面,选择模型进行加载。这里为了节约空间,我删除了 nilera/Qwen1.5-7B-Chat-Q4-GGUF 目录下的文件。
  1. 选择模型加载,等待加载完成即可像平时使用其他大模型的时候一样使用这些模型。
  1. 但是如果我们想在代码中使用我们的大模型应该怎么做呢?我们可以选择 LM-StudioLocal Server 菜单项,选择 Start Server 即可部署到一个本地指定的端口(默认是 1234)。
  1. 右侧有许多样例,我们可以选择一段样例,如:chat(python),这里对这段代码进行简单的解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Example: reuse your existing OpenAI setup
from openai import OpenAI

# Point to the local server
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")

completion = client.chat.completions.create(
model="Publisher/Repository", # 可以理解为模型路径, 这里以启动在这个端口的模型为准
messages=[
{"role": "system", "content": "Always answer in Chinese."}, # 系统设置: 每次都用中文回答
{"role": "user", "content": "Introduce yourself."} # 对话设置: 这里希望 AI 介绍一下他自己
],
temperature=0.7,
)

print(completion.choices[0].message) # 获取模型的回复
  1. 然后我们就可以愉快的使用 Python 调用我们的本地大模型了。

⛵ 2. 使用 PowerInfer 框架

PowerInfer 框架 GitHub 链接:SJTU-IPADS/PowerInfer: High-speed Large Language Model Serving on PCs with Consumer-grade GPUs (github.com)

$2024$ 年发布论文 PowerInfer-2[2406.06282] PowerInfer-2: Fast Large Language Model Inference on a Smartphone (arxiv.org)

Anaconda 命令使用:【anaconda】conda创建、查看、删除虚拟环境(anaconda命令集)_conda 创建环境-CSDN博客

参考博客:大模型笔记之-3090显卡推理70B参数模型|基于PowerInfer 一个 CPU/GPU LLM 推理引擎-CSDN博客

  1. 使用 Conda 创建环境,这里 Python 版本需要大于 3.8
1
conda create -n powerinfer1 python=3.8
  1. 激活 Conda 环境:
1
conda activate powerinfer1
  1. 克隆 PowerInfer 框架代码:
1
git clone git@github.com:SJTU-IPADS/PowerInfer.git
  1. 安装所需依赖:
1
pip install -r requirements.txt
  1. 使用 CMake 进行编译(CMake 版本需要大于:3.17+

    这里很大概率可能会出现编译器版本与 CUDA 版本不一致的情况,解决方案:fatal error C1189: #error: – unsupported Microsoft Visual Studio version! - CSDN博客

    这里我有三个 CUDA 版本,貌似修改其中任意一个就可以,这里我修改的是 CUDA v11.6 版本。

    ① 如果是 NVIDIA GPUs,需要使用如下方式进行编译:

    1
    2
    cmake -S . -B build -DLLAMA_CUBLAS=ON
    cmake --build build --config Release

    ② 如果是 AMD GPUs,需要使用下面的方式进行编译:

    1
    2
    3
    4
    # Replace '1100' to your card architecture name, you can get it by rocminfo
    CC=/opt/rocm/llvm/bin/clang CXX=/opt/rocm/llvm/bin/clang++ cmake -S . -B build -
    DLLAMA_HIPBLAS=ON -DAMDGPU_TARGETS=gfx1100
    cmake --build build --config Release

    ③ 如果是 CPU ONLY,需要使用下面的方式进行编译:

    1
    2
    cmake -S . -B build
    cmake --build build --config Release

    这里我有一块 Nvidia 1050ti 所以我使用方式 ①进行编译。

  2. 对于我们下载的模型,可以使用提供的方式进行转化,转化为 PowerInfer 可以使用的类型:

1
2
3
# make sure that you have done `pip install -r requirements.txt`
python convert.py --outfile /PATH/TO/POWERINFER/GGUF/REPO/MODELNAME.powerinfer.gguf /PATH/TO/ORIGINAL/MODEL /PATH/TO/PREDICTOR
# python convert.py --outfile ./ReluLLaMA-70B-PowerInfer-GGUF/llama-70b-relu.powerinfer.gguf ./SparseLLM/ReluLLaMA-70B ./PowerInfer/ReluLLaMA-70B-Predictor
1
python convert.py --outfile D:/LMStudio/models/Publisher/Repository/qwen1_5-7b-chat-q4_0.gguf ./SparseLLM/ReluLLaMA-70B ./PowerInfer/ReluLLaMA-70B-Predictor
  1. 或者将要 原始模型转化为 GGUF 模型
1
python convert-dense.py --outfile /PATH/TO/DENSE/GGUF/REPO/MODELNAME.gguf /PATH/TO/ORIGINAL/MODEL
  1. 运行模型
1
2
3
./build/bin/Release/main.exe -m C:/Users/NilEra/Downloads/llama-7b-relu.powerinfer.gguf -n 128 -t 2 -p "Once upon a time"

# 其中/home/user/data/ReluLLaMA-70B-PowerInfer-GGUF/llama-70b-relu.q4.powerinfer.gguf为GPTQ量化过的模型文件
  1. 一些问题:

Issus22

🔧 3. 在 Windows 上搭建 llama.cpp

  1. 在 Windows 上搭建 llama.cpp 是需要安装很多工具,且安装完成后也存在无法正常成功编译的情况(存在依赖、库等各种问题),因此这里我们可以使用 w64devkit 工具,使用他可以方便我们进行 llama.cpp 的编译。首先我们先下载 w64devkit

    参考网址01

    参考网址02

  2. 然后再 make 可以了

LLM_General_Education

🤗 大语言模型通识

大语言模型的配置需求

首先要搞清楚,本地可以部署什么大模型,取决于个人电脑的硬件配置,尤其需要关注 GPU 的显存。一般来说,只要本地机器 GPU 的显存能够满足大模型的要求,那基本上都可以本地部署。

那么大模型类别这么多,有 $7B$、$13B$、$70B$ 等等,GPU 显存如何准备呢?

在没有考虑任何模型量化技术的前提下,有公式如下:
$$
GB = B × 2
$$

其中为 $GB$ 模型显存占用,$B$ 为大模型参数量。

参考资料

AI大模型本地化部署Q/A硬件篇

如何找到最新的大模型、如何判断本地硬件是否满足大模型需求、如何快速部署大模型

大模型综合评测对比 | 当前主流大模型在各评测数据集上的表现总榜单 | 数据学习 (DataLearner)