English Русский Español Deutsch 日本語 Português
preview
将您自己的LLM集成到EA中(第2部分):环境部署示例

将您自己的LLM集成到EA中(第2部分):环境部署示例

MetaTrader 5交易 | 14 五月 2024, 10:34
448 0
Yuqiang Pan
Yuqiang Pan

概述

在上一篇文章中,我们介绍了在本地运行LLM的基本硬件知识,还提到了不同环境之间的差异及其各自的优缺点。因此,在本文中,我们将不讨论其他系统(如Windows、Linux和MacOS)的环境设置,而只讨论Windows+WSL的配置。我们将逐步配置环境并实现本地LLM操作。

目录:

  1. 概述
  2. WSL2
  3. WSL2 的安装
  4. 配置
  5. WSL的常用命令
  6. 软件配置
  7. 结论

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,如下图所示。

hyper

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操作)时,系统会要求您输入。但如果你不小心忘记了,别担心,有一种方法可以解决这个问题,而无需重新安装子系统。

ins

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发行版,单击图标进行安装。

如图所示:

store

注意:使用子系统一段时间后,您可能会清理一些不再需要的内容以释放空间(如缓存)。虽然内容已经被删除,但您会发现子系统的虚拟硬盘占用的空间并没有减少。此时,我们可以使用管理员权限运行命令提示符或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库。

  1. 首先,我们启动WSL命令行,并在命令行中输入:wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh.
  2. 在等待下载完成后,我们需要给这个文件更高的权限:sudo chmod 777 Miniconda3-latest-Linux-x86_64.sh,此时系统会提示您输入密码,这个密码就是我们创建WSL2时输入的密码。
  3. 在命令行中输入:/Miniconda3-latest-Linux-x86_64.sh,安装完成后,您的命令行前端会有更多(基本)字,如图所示:

base

2. 代码编辑器

  • 如果您已经在Windows环境中安装了Pycharm或vscode等代码编辑器,则可以通过设置找到WSL2的python环境。
  • 如果没有,您只需要在WSL2命令提示符下输入“code”,等待它自动为您安装,vscode将直接启动。启动后,您将在左下角找到单词WSL,表示vscode已连接到WSL。如图所示:
vscode

提示:在wsl2子系统命令行中,使用cd命令直接转到需要编辑代码的位置,然后单击“code”会直接启动vscode并定位那个文件夹,非常方便。

3. GPU加速推理

这里我们只讨论NVIDIA的显卡加速。如果您使用其他卡,请搜索相关的配置方法。我们不会一一列出。

1.使用Docker设置NVIDIA CUDA加速

  • 安装 Docker 支持:运行 ‘curl https://get.docker.com“|sh”,然后运行“sudo service docker start”。这将启动 Docker 服务。
  • 为 NVIDIA 容器工具包设置稳定的存储库:在命令行中按顺序运行以下命令: 
    1. distribution=$(. /etc/os-release;echo $ID$VERSION_ID);
    2. curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker-keyring.gpg;
    3. 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 容器。如图所示:

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”。

注意:

  1. “llm”是我们要创建的虚拟环境的名称,可以任意更改。
  2. '-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

开发回放系统(第32部分):订单系统(一) 开发回放系统(第32部分):订单系统(一)
在我们迄今为止开发的所有东西中,正如你可能会注意到并最终同意的那样,这个系统是最复杂的。现在我们需要做一些非常简单的事情:让我们的系统模拟交易服务器的操作。准确实现交易服务器操作方式似乎是一件轻而易举的事情。至少说起来是这样。但我们需要这样做,以便对回放/模拟系统的用户来说,一切都是无缝和透明的。
开发回放系统 — 市场模拟(第 27 部分):智能交易系统项目 — C_Mouse 类 开发回放系统 — 市场模拟(第 27 部分):智能交易系统项目 — C_Mouse 类
在本文中,我们将实现 C_Mouse 类。它提供了最高级别的编程能力。不过,说到高级或低级编程语言,并不是在代码中包含污言秽语或行话。它有其它含义。当我们谈论高级或低级编程时,我们意指对于其他程序员来说理解代码是多么容易或困难。
开发回放系统 — 市场模拟(第 28 部分):智能交易系统项目 — C_Mouse 类 (II) 开发回放系统 — 市场模拟(第 28 部分):智能交易系统项目 — C_Mouse 类 (II)
当人们开始创建第一个拥有计算能力的系统时,一切都需要工程师的参与,他们必须非常熟知该项目。我们谈论的是计算机技术的曙光,那个时代甚至没有用于编程的终端。随着它的发展,越来越多的人对能够创造一些东西感兴趣,涌现出新的思路和编程方式,取代了旧式风格的改变连接器位置。这就是第一个终端出现的时刻。
开发回放系统(第31部分):EA交易项目——C_Mouse类(五) 开发回放系统(第31部分):EA交易项目——C_Mouse类(五)
我们需要一个计时器,它可以显示距离回放/模拟运行结束还有多少时间。乍一看,这可能是一个简单快捷的解决方案。许多人只是尝试适应并使用交易服务器使用的相同系统。但有一件事是很多人在考虑这个解决方案时没有考虑的:对于回放,甚至更多的是模拟,时钟的工作方式不同。所有这些都使创建这样一个系统变得复杂。