amd rocm for windows 手动编译

前言:这个教程是为官方不支持 HIP SDK 的 amd GPU 准备的,支持的 GPU 在安装好 HIP SDK 后直接从官方渠道下载应用并体验。

这个教程大部分的操作都转为了 powershell 命令行操作,方便后续制作成一键式脚本。

后续有下载失败,自行开启代理。

rocBLAS 编译

环境准备

  1. windows 系统&硬件要求

    没有 HIP SDK 支持但有 ROCm runtime 支持的 gpu 也能安装 HIP SDK,只是后续需要手动编译 rocBLAS。

  2. 安装 HIP SDK。安装好后将 HIP 执行文件目录添加到 Path 环境变量,下面是 powershell 添加示例。

    # 目前(2024年5月29日) HIP SDK for windows 最新为 5.7.x。
    # Check:安装成功后,会自动添加 HIP_Path 环境变量,说明安装成功
    $HIP_PATH=[Environment]::GetEnvironmentVariable("HIP_Path", "Machine")
    echo $HIP_PATH
    # C:\Program Files\AMD\ROCm\5.7\
    
    # 下面是 gpt 生成的添加Path环境变量的函数
    function AddToPath([string]$pathToAdd) {
        $oldPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
        if (-not $oldPath.Contains($pathToAdd)) {
            $newPath = "$oldPath;$pathToAdd"
            [Environment]::SetEnvironmentVariable("Path", $newPath, "Machine")
            Write-Host "Path updated successfully."
        } else {
            Write-Host "Path already exists in the environment variable."
        }
    }
    
    # 调用函数,添加 HIP_Path 执行文件目录
    AddToPath "%HIP_Path%\bin"
    
    # check command
    hipcc --version
    #HIP version: 5.7.32000-193a0b56e
    #clang version 17.0.0 (git@github.amd.com:Compute-Mirrors/llvm-project 6e709f613348e5258188527d11ee8d78376f26b7)
    #Target: x86_64-pc-windows-msvc
    #Thread model: posix
    #InstalledDir: C:\Program Files\AMD\ROCm\5.7\\bin
    
    # 获取查看显卡架构,后续需要使用
    $arch=$(hipinfo | Select-String ArchName).Line.Split()[-1]
    echo $arch
    # gfx1032
    
  3. 软件安装:

    • git
    • curl
    • perl
    • python38(个人环境习惯,最后一个官方支持 win7 的版本,高于此版本应该都行)、
    • cmake (c++ 项目编译工具)
    • ninja (cmake 的生成器)
    • vcpkg ( visual stdio 的 c++ 包管理器)

    推荐使用 scoop 安装,会自动配置命令路径至 Path 环境变量

    scoop install main/git main/curl main/perl main/vcpkg main/cmake main/ninja versions/python38
    

    后续安装 vs c++ develop tool 时,cmake、ninja 也会安装,如果使用 vs 提供的,需要自己配置对应的 Path 环境变量。

    check 命令是否正常(也可以用 GET-COMMAND​命令)

    git --version
    # git version 2.45.1.windows.1
    curl --version
    # curl 8.8.0 (x86_64-w64-mingw32) libcurl/8.8.0 LibreSSL/3.9.2 zlib/1.3.1 brotli/1.1.0 zstd/1.5.6 WinIDN libpsl/0.21.5 libssh2/1.11.0 nghttp2/1.62.1 ngtcp2/1.5.0 nghttp3/1.3.0
    perl --version
    # This is perl 5, version 38, subversion 2 (v5.38.2) built for MSWin32-x64-multi-thread
    python --version
    # Python 3.8.10
    cmake --version
    # cmake version 3.29.3
    ninja --version
    # 1.12.1
    vcpkg --version
    # vcpkg package management program version 2024-04-23-d6945642ee5c3076addd1a42c331bbf4cfc97457
    
  4. c++ 编译环境安装

    visual stdio 2022 Community(已有其他版本也可以,但是需要安装 c++ 开发组件【包括推荐】) ,推荐使用 winget-cli 安装。

    # 社区版默认下载只有编辑器,命令添加了 C++ 开发组件 Microsoft.VisualStudio.Workload.NativeDesktop
    # 静默安装为后台安装。需要 wizard 交互确认或者配置其他的参数(如安装路径),删除下面命令的 --quiet 参数
    # 因为安装下载是静默,所以需要查看后台的 visualstdioInstaller 进程结束后才是真正安装完成。
    winget install --id 'Microsoft.VisualStudio.2022.Community' --override "--quiet --add Microsoft.VisualStudio.Workload.NativeDesktop;includeRecommended"
    

编译

  参考资料

  1. 创建工作目录 $HOME/ROCm​,后续所有的命令默认从工作目录开始

    mkdir $HOME/ROCm
    
  2. Tensile 是 rocBLAS 依赖的 tensor 运算库。rocBLAS 编译的时候可以选择使用仓库中已编译好的库,也可以指定本地的 Tensile 手动编译。

    1. 获取 Tensile 源码

      # Tensile,节省下载的时间,只下所需的最新源码版本
      git clone -b release/rocm-rel-5.7 --depth 1 https://github.com/ROCm/Tensile.git $HOME/ROCm/Tensile
      
    2. 获取支持 fallback gpu 编译的补丁:

      curl -L https://raw.githubusercontent.com/ulyssesrr/docker-rocm-xtra/main/rocm-xtra-builder-rocblas/patches/Tensile-fix-fallback-arch-build.patch -o $HOME/ROCm/Tensile-fix-fallback-arch-build.patch
      cd $HOME/ROCm/Tensile
      git apply ../Tensile-fix-fallback-arch-build.patch
      
    3. 最新 vcpkg 中仓库的 msgpack​ 分化成了 msgpack-cxx​ 和 msgpack-c​ 两个库,devolper 分支的代码已经修复了这个问题。

      curl -L https://raw.githubusercontent.com/ROCm/Tensile/develop/Tensile/Source/lib/CMakeLists.txt -o $HOME/ROCm/Tensile/Tensile/Source/lib/CMakeLists.txt
      
    4. (符合的 GPU 可直接跳过。下面内容来源 bilibili - Windows 编译 AMD ROCm rocblas 教程

      Tensile 默认情况下并不支持某些显卡(比如核显),比如 gfx1103——780M,需要自行在源码中添加相应(遍历 下面文件中 gfxxxx​,然后添加对应的代码。

      Tensile\pytest.ini
      Tensile\Tensile\Source\CMakeLists.txt
      Tensile\Tensile\Source\lib\include\Tensile\AMDGPU.hpp
      Tensile\Tensile\Source\lib\include\Tensile\Serialization\Predicates.hpp
      

      以及 Tensile-rocm\Tensile\Common.py​ 中修改 globalParameters["SupportedISA"]CACHED_ASM_CAPS​ 这两个变量

  3. rocBLAS

    1. 源码和依赖下载

      5.7 目前 gfx1032 无法编译 lazy lib: https://github.com/LostRuins/koboldcpp/issues/655#issuecomment-1937866919。只能 no-lazy。

      # rocBLAS,节省下载的时间,只下所需的最新源码版本
      git clone -b release/rocm-rel-5.7 --depth 1 https://github.com/ROCm/rocBLAS.git $HOME/ROCm/rocBLAS
      cd $HOME/ROCm/rocBLAS
      # 下载依赖
      python .\rdeps.py
      
    2. 编译

      # 编译库。-t 要指定 Tensile 的绝对路径
      python .\rmake.py -a $arch --lazy-library-loading --no-merge-architectures -t $HOME\ROCm\Tensile\
      
  4. 将生成的 dll 和库文件,拷贝到 ROCm 的 library 下

    
    # 
    ls .\build\release\staging\
    # rocblas.dll
    cp '.\build\release\staging\rocblas.dll' "$HIP_PATH\bin\"
    
    ls .\build\release\Tensile\library\
    # Kernels.so-000-gfx1032.hsaco  TensileLibrary.dat  TensileManifest.txt
    cp .\build\release\Tensile\library\* "$HIP_PATH\bin\rocblas\library"
    

  ‍

ollama 编译

环境准备

  前提:已完成 rocBLAS​ 的编译。

  软件安装:

  • go 1.22
  • mingw ( llama 依赖的 c++ 编译)
scoop install main/go main/mingw
# check
go version
# go version go1.22.3 windows/amd64
mingw32-make.exe --version
# GNU Make 4.4.1
# Built for x86_64-w64-mingw32

编译

  参考资料

  1. llama_server:

    # 下载 Ollama v0.1.39 最新的代码
    git clone -b v0.1.39 --depth 1 https://github.com/ollama/ollama.git $HOME\ollama-v0.1.39
    cd $HOME\ollama0.1.39
    $env:CGO_ENABLED="1"
    $env:AMDGPU_TARGETS="$arch"
    # 这里会下载 llama.cpp 并会自动编译
    # llama 的编译会很久(cpu、cpu_avx、cuda、rocm都要编译一次)
    # 若不想全部编译,可以在下载完成后,Ctrl-c 终止,修改 llm\generate\gen_windows.ps1, 只留下所需的 build_rocm。
    go generate ./...
    
  2. ollama:

    # 此时依旧在 $HOME\ollama0.1.39 目录下
    # 编译 ollama
    go build .
    

简单使用

  服务端和客户端分别在两个不同的终端中启动

  • 服务端

    # 这个环境变量的作用是跳过 ollama 的可用 rocm GPU 的检测
    $env:HSA_OVERRIDE_GFX_VERSION="10.1.0"
    Invoke-Expression "$HOME\ollama-v0.1.39\ollama.exe serve"
    # ...下面的输出说明成功通过 rocm 运行在 GPU 上
    # time=2024-05-31T20:26:28.433+08:00 level=INFO source=payload.go:44 msg="Dynamic LLM libraries [rocm_v5.7]"
    # time=2024-05-31T20:26:28.473+08:00 level=INFO source=amd_windows.go:63 msg="skipping rocm gfx compatibility check" HSA_OVERRIDE_GFX_VERSION=10.1.0
    # time=2024-05-31T20:26:28.922+08:00 level=INFO source=types.go:71 msg="inference compute" id=0 library=rocm compute=gfx1032 driver=0.0 name="AMD Radeon RX 6650 XT" total="8.0 GiB" available="7.9 GiB"
    
  • 客户端

    # 模型拉取时,下载变慢,Ctrl-c停止重新执行拉取命令可恢复一定下载速度
    Invoke-Expression "$HOME\ollama-v0.1.39\ollama.exe pull llama3:latest"
    Invoke-Expression "$HOME\ollama-v0.1.39\ollama.exe run llama3"
    

  效果如下:

6f9643831d7aafd24c46f6cfefb8b75

50fbcb77ca81c326c54aef00b7798bb

  ‍

  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    540 引用 • 3529 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...