将您自己的LLM集成到EA中(第2部分):环境部署示例
概述
在上一篇文章中,我们介绍了在本地运行LLM的基本硬件知识,还提到了不同环境之间的差异及其各自的优缺点。因此,在本文中,我们将不讨论其他系统(如Windows、Linux和MacOS)的环境设置,而只讨论Windows+WSL的配置。我们将逐步配置环境并实现本地LLM操作。
目录:
WSL2
1. 关于 WSL2
WSL2是微软早在2017年就推出的WSL原始版本的重大升级。WSL2不仅仅是一个版本升级,它更快、更通用,并且使用了真正的Linux内核。直到今天,我相信很多人都不知道WSL的存在,包括一些IT从业者。他们仍在继续使用 Windows+虚拟机,或使用双系统模式,在需要使用Linux时从Windows切换。
当然,不可否认的是,有些任务可能需要一个完整的Linux环境,而WSL无法取代这个环境,因此这些方法并非没有理由。
2. 为什么使用WSL2
对于人工智能,我们主要使用Linux强大的命令行工具和GPU加速计算,因此双系统或Windows+虚拟机的配置似乎有点臃肿。WSL2本身有一个完整的Linux内核,更接近真实的Linux环境,并且WSL2可以与Windows文件系统无缝对接。您可以像在Windows下管理文件夹一样管理其文件系统。不到一秒钟,您就可以从Windows运行Linux命令行。因此,如果您想在Windows环境中高效、方便地使用Linux功能和工具,您永远不会后悔选择WSL2。
WSL2 的安装
1. 安装要求:
1). Windows版本必须是Windows 10版本2004或更高版本(内部版本19041或更高)或Windows 11,并且已安装KB4566116更新。当然,如果版本较旧,仍然可以使用,但需要手动操作。我们稍后将对此进行讨论。
2). WSL2可能需要启用Windows的“虚拟机平台”功能。为什么使用“可能”?因为我还没有试验过是否可以在不启用Windows 10的情况下安装它,但也可以在我的计算机(Win11-22H2)上不启用它来安装它。因此,如果您的安装失败,请在“开始”中搜索“Windows功能”并打开Hyper-V,如下图所示。
3). 磁盘有足够的保留空间,可能至少为1G。当然,这是一切正常运行的基础。默认安装将安装在C驱动器下,但如果您担心您的C驱动器空间,我们也可以迁移到其他分区,稍后将介绍。
2. 安装
1). 如果您对Linux发行版没有要求(如果您对其版本有特殊要求,请不要急于输入命令,请参阅下一个内容),您只需要以管理员身份打开PowerShell并输入:wsl--install。
2). 如果要指定Linux发行版的版本,请以管理员身份打开PowerShell,然后运行以下命令以指定Linux发行版本的方式安装WSL2:
wsl --install -d <Distribution Name> (您可以使用想安装的发布版来替代 <Distribution Name> , 例如: Ubuntu-20.04).
如果您想要更多的选择,您可以使用wsl --list --online(或使用wsl -l -o)来查看可用的Linux发行版。好消息是,您可以安装多个不同版本的Linux,并且只需要在运行时进行切换。
提示:如果您想安装未列出为可用的Linux发行版,您可以使用TAR文件导入任何Linux发行版。
3). 有几种方法可以运行子系统:
- 从“开始”菜单打开发行版(默认为Ubuntu)。
- 直接在Windows命令提示符或PowerShell中键入“wsl”,然后按enter键。
- 在Windows命令提示符或PowerShell中,可以输入已安装的分发的名称。例如:ubuntu。
- 如果您安装了多个版本的Linux,可以使用命令wsl -l -v查看相关信息,然后使用命令wsl [name]选择要启动的版本。例如:wsl -ubuntu。
4). 第一次运行它时,会提示您设置用户名和密码。请注意,当您输入密码时,它将不会显示,光标也不会移动。你只需要记住密码,然后按回车键。当您需要管理员权限(如sudo操作)时,系统会要求您输入。但如果你不小心忘记了,别担心,有一种方法可以解决这个问题,而无需重新安装子系统。
5). 如果您想退出子系统,只需在命令行中键入“exit”即可。如果不确定子系统是否正在运行,可以在命令提示符或PowerShell中使用“wsl -l -v”查看相关信息,并使用“wsl --shutdown”关闭所有子系统。
提示:如果你想使用图形子系统,可以参考微软官方网站上的相关内容来实现,但作者强烈建议不要这样做!
配置
1. 迁移到其他分区
如果系统磁盘资源相对紧张,可以考虑将子系统迁移到其他磁盘或分区。具体操作如下:
1). 在Windows命令提示符或PowerShell中键入:“wsl -l -v --all”以查看需要迁移的子系统。
2). 键入Windows命令提示符或PowerShell:“wsl --shutdown”以确保所有子系统都已关闭。
3). 在Windows命令提示符或PowerShell中键入:“wsl --export <Subsystem Name><Path to Store Subsystem Compressed Package>”,例如:“wsl --export ubuntu f:\wsl-ubuntu.tar”。
4). 在Windows命令提示符或PowerShell中键入:“wsl --unregister <Subsystem Name>”,例如:“wsl --unregister ubuntu”。
5). 在Windows命令提示符或PowerShell中键入:“wsl --import <Subsystem Name><Path to Migrate Subsystem><Original Exported Subsystem Compressed Package Path> --version 2”,例如:“wsl -import new_ubuntu F:\wsl\ubunto_wsl F:\wsl-ubuntu.tar --version 2。”。
6). 可以删除原始导出的子系统压缩包,也可以将其用作备份文件。
注意:如果要备份子系统,可以参考此处的内容。
2. 设置配置文件
WSL2子系统配置文件有两种类型,一种是Windows下的全局配置文件,另一种是子系统下的本地配置文件。我们主要配置全局配置文件,该文件的路径为“C:\Users\<UserName>\.wslconfig”。您需要使用文本编辑器打开它进行编辑。我们需要配置的主要选项是内存、交换和交换文件。在设置之前,请确保子系统处于关闭状态,这一点非常重要!
- -memory:配置我们分配给子系统的最大内存。
- -swap: 要添加到WSL2VM的交换空间量,0表示没有交换文件。交换存储是基于磁盘的RAM,当内存需求超过硬件设备的限制时使用。
- -swapfile:交换虚拟硬盘的绝对Windows路径。这个路径可以根据你自己的情况设置,也可以在任何地方。
直接进入配置文件路径,然后用记事本打开,添加以下4行内容,注意末尾没有标点符号:
[wsl2]
memory=8GB
swap=60GB
swapfile=G:\\wsl\\swap\\wsl-swap.vhdx
您需要用自己的路径替换“G:\\wsl\\swap\\wsl swap.vhdx”。
注意:这里有一个非常重要的问题,即在运行LLM时,尽量确保您的内存+交换值大于模型大小,否则读取模型时会出现问题。
3. 在旧版本的Windows 10上安装WSL2
1). 确保系统版本为1903或更高版本,内部版本为18362.1049或更高。
2). 以管理员身份打开PowerShell并运行命令:“dism.exe /online /ennable feature /featurename:VirtualMachinePlatform /all /norestart”,然后重新启动计算机。
3). 下载Linux内核包,下载链接:'https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi'.
4). 双击以运行下载的内核包并完成安装。
5). 以管理员身份打开PowerShell,然后运行命令:“wsl --set-default-version 2”。
6). 打开Microsoft Store,选择您喜欢的Linux发行版,单击图标进行安装。
如图所示:
注意:使用子系统一段时间后,您可能会清理一些不再需要的内容以释放空间(如缓存)。虽然内容已经被删除,但您会发现子系统的虚拟硬盘占用的空间并没有减少。此时,我们可以使用管理员权限运行命令提示符或PowerShell,并使用磁盘部分中的虚拟硬盘管理命令“vdisk”来压缩虚拟硬盘。
WSL的常用命令
用法:wsl.exe [参数][选项…][命令行]
1. 运行Linux二进制文件的参数
如果没有提供命令行,wsl.exe将启动默认的shell。
--exec, -e <CommandLine>
在不使用默认Linux shell的情况下执行指定的命令。
--shell-type <Type>
使用提供的shell类型执行指定的命令。
Types:
- standard
使用默认的Linux shell执行指定的命令。
- login
使用默认的Linux shell作为登录shell执行指定的命令。
- none
在不使用默认Linux shell的情况下执行指定的命令。
--
按原样传递命令行的其余部分。
2. 选项
--cd <Directory>
将指定的目录设置为当前工作目录。
如果使用~,它将使用Linux用户的主路径。如果路径以字符开头,它将被解释为绝对的Linux路径。
否则,此值必须是一个绝对的Windows路径。
--distribution, -d <Distro>
运行指定的发行版。
--user, -u <UserName>
以指定用户身份运行。
--system
启动用于系统分发的shell。
3. 用于管理Linux的Windows子系统的参数
--help
显示使用方法信息。
--debug-shell
打开WSL2调试shell进行诊断。
--event-viewer
打开Windows事件查看器的应用程序视图。
--install [Distro] [Options...]
安装Windows Subsystem for Linux的发行版。
要查看可用发行版的列表,请使用“wsl.exe -list -online”。
选项:
--no-launch, -n
安装后不要开始分发。
--web-download
从Internet而不是Microsoft商店下载分发内容。
--mount <Disk>
在所有WSL2发行版中连接和装载物理磁盘或虚拟磁盘。
选项:
--vhd
指定<Disk>表示虚拟硬盘。
--bare
将磁盘连接到WSL2,但不要装载它。
--name <Name>
使用装载点的自定义名称装载磁盘。
--type <Type>
装载磁盘时使用的文件系统,如果未指定,则默认为ext4。
--options <Options>
其他安装选项。
--partition <Index>
要装载的分区索引(如果未指定)默认为整个磁盘。
--release-notes
打开web浏览器以查看WSL发行说明页面。
--set-default-version <Version>
更改新发行版的默认安装版本。
--shutdown
立即终止所有正在运行的分发版和WSL2轻量级虚拟机。
--status
显示Windows Subsystem for Linux的状态。
--unmount [Disk]
从所有WSL2发行版中卸载磁盘并分离磁盘。如果在没有参数的情况下调用,请卸载并分离所有磁盘。
--update
Windows Subsystem for Linux的更新包。
选项:
--web-download
从Internet而不是Microsoft商店下载更新。
--pre-release
下载预发布版本(如果可用)。指示使用 -web-download。
--version, -v
显示版本信息。
4. 在Windows Subsystem for Linux中管理发行版的参数
--export <Distro> <FileName> [Options]
将分发导出为tar文件。
对于标准输出,文件名可以是“-”。
选项:
--vhd
指定要导出为.vhdx文件的分发。
--import <Distro> <InstallLocation> <FileName> [Options]
将指定的tar导入为新分发。对于标准输入,文件名可以是“-”。
选项:
--version <Version>
指定要用于新分发的版本。
--vhd
指定提供的文件是.vhdx文件,而不是tar文件。
此操作将在指定的安装位置生成.vhdx文件的副本。
--import-in-place <Distro> <FileName>
将指定的.vhdx导入为新分发。
此虚拟硬盘必须使用ext4文件系统类型进行格式化。
--list, -l [Options]
列出发行版。
选项:
--all
列出所有发行版,包括当前正在安装或卸载的发行版。
--running
仅列出当前正在运行的分发版本。
--quiet, -q
仅显示分发名称。
--verbose, -v
显示有关所有分发的详细信息。
--online, -o
使用“wsl.exe –install”显示可以安装的可用分发版本的列表。
--set-default, -s <Distro>
将分发设置为默认分发。
--set-version <Distro> <Version>
更改指定分发的版本。
--terminate, -t <Distro>
终止指定的分发。
--unregister <Distro>
注销分发并删除根文件系统。
软件配置
接下来,我们将在WSL中部署相关软件,包括环境管理软件、代码编辑软件等,并展示一个示例来演示如何在WSL2中运行LLM。
1. Python库管理
我们主要使用miniconda来管理python库。
- 首先,我们启动WSL命令行,并在命令行中输入:wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh.
- 在等待下载完成后,我们需要给这个文件更高的权限:sudo chmod 777 Miniconda3-latest-Linux-x86_64.sh,此时系统会提示您输入密码,这个密码就是我们创建WSL2时输入的密码。
- 在命令行中输入:/Miniconda3-latest-Linux-x86_64.sh,安装完成后,您的命令行前端会有更多(基本)字,如图所示:
2. 代码编辑器
- 如果您已经在Windows环境中安装了Pycharm或vscode等代码编辑器,则可以通过设置找到WSL2的python环境。
- 如果没有,您只需要在WSL2命令提示符下输入“code”,等待它自动为您安装,vscode将直接启动。启动后,您将在左下角找到单词WSL,表示vscode已连接到WSL。如图所示:
提示:在wsl2子系统命令行中,使用cd命令直接转到需要编辑代码的位置,然后单击“code”会直接启动vscode并定位那个文件夹,非常方便。
3. GPU加速推理
这里我们只讨论NVIDIA的显卡加速。如果您使用其他卡,请搜索相关的配置方法。我们不会一一列出。
1.使用Docker设置NVIDIA CUDA加速
- 安装 Docker 支持:运行 ‘curl https://get.docker.com“|sh”,然后运行“sudo service docker start”。这将启动 Docker 服务。
- 为 NVIDIA 容器工具包设置稳定的存储库:在命令行中按顺序运行以下命令:
- distribution=$(. /etc/os-release;echo $ID$VERSION_ID);
- curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker-keyring.gpg;
- curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-docker-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-docker.list.
- 安装 NVIDIA 运行时包和依赖项:在命令行中依次运行以下命令:sudo apt-get-update; sudo apt-get install -y nvidia-docker2。
- 启动容器:在命令行中运行 “docker run -gpus all -it -shm-size=1g -ulimit memlock=-1 -ulimit stack=67108864 nvcr.io/nvidia/tensorflow:20.03-tf2-py3”。 <segment 3274¶>完成后,我们将进入一个具有CUDA加速能力的 docker 容器。如图所示:
2). 手动安装 NVIDIA CUDA 加速
- - 获取安装包:在命令行中运行 'wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run'。
- - 运行安装包:在命令行中运行 “sudo sh cuda_112.2.2_535.104.05_linux.run”。如果出现错误,请在命令中添加 '-override',例如:sudo sh cuda_112.2.2_535.104.05_linux.run -override。
- - 添加相应的环境变量:在命令行中运行 “sudo-vim ~/.bashrc”,并在文件末尾添加以下内容:
```
export PATH=/usr/local/cuda-12.2.2/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-12.2.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} export CUDA_HOME=/usr/local/cuda-12.2.2${CUDA_HOME:+:${CUDA_HOME}}```
- -更新环境变量:在命令行中运行 “source ~/.bashrc”。
注意:如果您运行 'sudo-vim~/.bashrc',发现您不熟悉vim,也可以找到此文件并将其复制到Windows环境中,使用文本编辑器编辑和添加相关内容,然后在编辑完成后将其复制回来。这样做的好处是它还支持“.bashrc”。
4. 运行 LLM
1). 创建一个 conda 虚拟环境:在命令行中输入“conda create -n llm python=3.10”。
注意:
- “llm”是我们要创建的虚拟环境的名称,可以任意更改。
- '-python=3.10'指定虚拟环境使用的python版本。虽然也可以使用“conda create-n llm”,但强烈建议指定版本!
2). 切换到虚拟环境:在命令行中输入“conda-activate llm”以激活我们的虚拟环境。
命令提示符前端的“(base)”将切换为“(llm)”。如果要退出虚拟环境,请使用“conda deactivate”。
3). 从huggingface中查找要使用的LLM:https://huggingface.co。
由于模型太多,您可以参考开源模型排名 https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard。建议使用llama.cpp支持的格式。如果您的国家(地区)无法访问 huggingface,请使用魔法击败魔法!
4). 下载模型:首先,您需要启用git的大文件支持,在命令行中输入“git lfs install”。
运行后,输入'git-clone https://huggingface.co/“<library name>”,将“<libraryname>”替换为要下载的模型的名称。例如:'git clone https://huggingface.co/Phind/Phind-CodeLlama-34B-v2',请等待下载完成。
5). 安装 llama.cpp 的 python 版本 llama-cpp-python:在命令行中输入“CMAKE_ARGS=“-DLLAMA_CUBLAS=on” pip install llama-cpp-python”,然后等待安装完成。安装后,llama.cpp 同时支持 CPU 和 GPU 推理(当然也支持其他品牌显卡的加速,请参考:https://github.com/abetlen/llama-cpp-python)。
注意:如果您没有显卡,或者没有安装GPU加速支持,请使用“pip-install-lama-cpp-python”进行安装。尽管推理速度较慢,但它并非不可用。
6). 运行推理:创建一个py文件,将其命名为test.py。将以下内容复制到文件中:
from llama_cpp import Llama
llm = Llama(model_path="./models/7B/llama-model.gguf")
output = llm("Q: Name the planets in the solar system? A: ", max_tokens=32, stop=["Q:", "\n"], echo=True)
print(output)
然后在命令行中运行“python test.py”,您可以看到输出:
{ "id": "cmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "object": "text_completion", "created": 1679561337, "model": "./models/7B/llama-model.gguf", "choices": [ { "text": "Q: Name the planets in the solar system? A: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto.", "index": 0, "logprobs": None, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 14, "completion_tokens": 28, "total_tokens": 42 } }
注意:
1. “model_path”是您下载模型文件的位置;
2. “Q:Name the planets in the solar system?A: “Q后面是您想问的问题,可以更改为任何问题。
3. “Q:Name the planets in the solar system?A: ” A后面是LLM的答案。
结论
在本文中,我们逐步探讨了如何创建一个可以运行LLM的WSL2环境,并详细介绍了使用中的WSL2的各种细节。然后,我们介绍了一个用最少的代码运行LLM推理的简单示例,我们也相信您也体验到了llama.cpp的简单性和强大性。在下一篇文章中,我们将讨论如何从许多LLM中选择合适的模型,以适应我们将其集成到算法交易中的目的。
敬请期待!
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/13496