llm.c的Makefile

源码

CC ?= clang
CFLAGS = -Ofast -Wno-unused-result -Wno-ignored-pragmas -Wno-unknown-attributes
LDFLAGS =
LDLIBS = -lm
INCLUDES =
CFLAGS_COND = -march=native# Find nvcc
SHELL_UNAME = $(shell uname)
REMOVE_FILES = rm -f
OUTPUT_FILE = -o $@
CUDA_OUTPUT_FILE = -o $@# NVCC flags
# -t=0 is short for --threads, 0 = number of CPUs on the machine
NVCC_FLAGS = -O3 -t=0 --use_fast_math
NVCC_LDFLAGS = -lcublas -lcublasLt
NVCC_INCLUDES =
NVCC_LDLIBS =
NCLL_INCUDES =
NVCC_CUDNN =
# overridable flag for multi-GPU training. by default we won't build with cudnn
# because it bloats up the compile time from a few seconds to ~minute
USE_CUDNN ?= 0# autodect a lot of various supports on current platform
$(info ---------------------------------------------)ifneq ($(OS), Windows_NT)NVCC := $(shell which nvcc 2>/dev/null)# Function to test if the compiler accepts a given flag.define check_and_add_flag$(eval FLAG_SUPPORTED := $(shell printf "int main() { return 0; }\n" | $(CC) $(1) -x c - -o /dev/null 2>/dev/null && echo 'yes'))ifeq ($(FLAG_SUPPORTED),yes)CFLAGS += $(1)endifendef# Check each flag and add it if supported$(foreach flag,$(CFLAGS_COND),$(eval $(call check_and_add_flag,$(flag))))
elseCFLAGS :=REMOVE_FILES = del *.exe,*.obj,*.lib,*.exp,*.pdb && delSHELL_UNAME := Windowsifneq ($(shell where nvcc 2> nul),"")NVCC := nvccelseNVCC :=endifCC := clCFLAGS = /Idev /Zi /nologo /Wall /WX- /diagnostics:column /sdl /O2 /Oi /Ot /GL /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:fast /Zc:wchar_t /Zc:forScope /Zc:inline /permissive- \/external:W3 /Gd /TP /wd4996 /Fd$@.pdb /FC /openmp:llvmLDFLAGS :=LDLIBS :=INCLUDES :=NVCC_FLAGS += -I"dev"ifeq ($(WIN_CI_BUILD),1)$(info Windows CI build)OUTPUT_FILE = /link /OUT:$@CUDA_OUTPUT_FILE = -o $@else$(info Windows local build)OUTPUT_FILE = /link /OUT:$@ && copy /Y $@ $@.exeCUDA_OUTPUT_FILE = -o $@ && copy /Y $@.exe $@endif
endif# Check and include cudnn if available
# Currently hard-coding a bunch of stuff here for Linux, todo make this better/nicer
# You need cuDNN from: https://developer.nvidia.com/cudnn
# Follow the apt-get instructions
# And the cuDNN front-end from: https://github.com/NVIDIA/cudnn-frontend/tree/main
# For this there is no installation, just download the repo to your home directory
# and then we include it below (see currently hard-coded path assumed in home directory)
ifeq ($(USE_CUDNN), 1)ifeq ($(SHELL_UNAME), Linux)# hard-coded path for nowCUDNN_FRONTEND_PATH := $(HOME)/cudnn-frontend/includeifeq ($(shell [ -d $(CUDNN_FRONTEND_PATH) ] && echo "exists"), exists)$(info ✓ cuDNN found, will run with flash-attention)NVCC_INCLUDES += -I$(CUDNN_FRONTEND_PATH)NVCC_LDFLAGS += -lcudnnNVCC_FLAGS += -DENABLE_CUDNNNVCC_CUDNN = cudnn_att.oelse$(error ✗ cuDNN not found. See the Makefile for our currently hard-coded paths / install instructions)endifelse$(info → cuDNN is not supported right now outside of Linux)endif
else$(info → cuDNN is manually disabled by default, run make with `USE_CUDNN=1` to try to enable)
endif# Check if OpenMP is available
# This is done by attempting to compile an empty file with OpenMP flags
# OpenMP makes the code a lot faster so I advise installing it
# e.g. on MacOS: brew install libomp
# e.g. on Ubuntu: sudo apt-get install libomp-dev
# later, run the program by prepending the number of threads, e.g.: OMP_NUM_THREADS=8 ./gpt2
# First, check if NO_OMP is set to 1, if not, proceed with the OpenMP checks
ifeq ($(NO_OMP), 1)$(info OpenMP is manually disabled)
elseifneq ($(OS), Windows_NT)# Detect if running on macOS or Linuxifeq ($(SHELL_UNAME), Darwin)# Check for Homebrew's libomp installation in different common directoriesifeq ($(shell [ -d /opt/homebrew/opt/libomp/lib ] && echo "exists"), exists)# macOS with Homebrew on ARM (Apple Silicon)CFLAGS += -Xclang -fopenmp -DOMPLDFLAGS += -L/opt/homebrew/opt/libomp/libLDLIBS += -lompINCLUDES += -I/opt/homebrew/opt/libomp/include$(info ✓ OpenMP found)else ifeq ($(shell [ -d /usr/local/opt/libomp/lib ] && echo "exists"), exists)# macOS with Homebrew on IntelCFLAGS += -Xclang -fopenmp -DOMPLDFLAGS += -L/usr/local/opt/libomp/libLDLIBS += -lompINCLUDES += -I/usr/local/opt/libomp/include$(info ✓ OpenMP found)else$(info ✗ OpenMP not found)endifelse# Check for OpenMP support in GCC or Clang on Linuxifeq ($(shell echo | $(CC) -fopenmp -x c -E - > /dev/null 2>&1; echo $$?), 0)CFLAGS += -fopenmp -DOMPLDLIBS += -lgomp$(info ✓ OpenMP found)else$(info ✗ OpenMP not found)endifendifendif
endif# Check if OpenMPI and NCCL are available, include them if so, for multi-GPU training
ifeq ($(NO_MULTI_GPU), 1)$(info → Multi-GPU (OpenMPI + NCCL) is manually disabled)
elseifneq ($(OS), Windows_NT)# Detect if running on macOS or Linuxifeq ($(SHELL_UNAME), Darwin)$(info ✗ Multi-GPU on CUDA on Darwin is not supported, skipping OpenMPI + NCCL support)else ifeq ($(shell [ -d /usr/lib/x86_64-linux-gnu/openmpi/lib/ ] && [ -d /usr/lib/x86_64-linux-gnu/openmpi/include/ ] && echo "exists"), exists)$(info ✓ OpenMPI found, OK to train with multiple GPUs)NVCC_INCLUDES += -I/usr/lib/x86_64-linux-gnu/openmpi/includeNVCC_LDFLAGS += -L/usr/lib/x86_64-linux-gnu/openmpi/lib/NVCC_LDLIBS += -lmpi -lncclNVCC_FLAGS += -DMULTI_GPUelse$(info ✗ OpenMPI is not found, disabling multi-GPU support)$(info ---> On Linux you can try install OpenMPI with `sudo apt install openmpi-bin openmpi-doc libopenmpi-dev`)endifendif
endif# Precision settings, default to bf16 but ability to override
PRECISION ?= BF16
VALID_PRECISIONS := FP32 FP16 BF16
ifeq ($(filter $(PRECISION),$(VALID_PRECISIONS)),)$(error Invalid precision $(PRECISION), valid precisions are $(VALID_PRECISIONS))
endif
ifeq ($(PRECISION), FP32)PFLAGS = -DENABLE_FP32
else ifeq ($(PRECISION), FP16)PFLAGS = -DENABLE_FP16
elsePFLAGS = -DENABLE_BF16
endif# PHONY means these targets will always be executed
.PHONY: all train_gpt2 test_gpt2 train_gpt2cu test_gpt2cu train_gpt2fp32cu test_gpt2fp32cu profile_gpt2cu# Add targets
TARGETS = train_gpt2 test_gpt2# Conditional inclusion of CUDA targets
ifeq ($(NVCC),)$(info ✗ nvcc not found, skipping GPU/CUDA builds)
else$(info ✓ nvcc found, including GPU/CUDA support)TARGETS += train_gpt2cu test_gpt2cu train_gpt2fp32cu test_gpt2fp32cu
endif$(info ---------------------------------------------)all: $(TARGETS)train_gpt2: train_gpt2.c$(CC) $(CFLAGS) $(INCLUDES) $(LDFLAGS) $< $(LDLIBS) $(OUTPUT_FILE)test_gpt2: test_gpt2.c$(CC) $(CFLAGS) $(INCLUDES) $(LDFLAGS) $< $(LDLIBS) $(OUTPUT_FILE)cudnn_att.o: cudnn_att.cu$(NVCC) -c $(NVCC_FLAGS) $(PFLAGS) $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS)train_gpt2cu: train_gpt2.cu $(NVCC_CUDNN)$(NVCC) $(NVCC_FLAGS) $(PFLAGS) $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS) $(CUDA_OUTPUT_FILE) $(NVCC_CUDNN)train_gpt2fp32cu: train_gpt2_fp32.cu$(NVCC) $(NVCC_FLAGS) $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS) $(CUDA_OUTPUT_FILE)test_gpt2cu: test_gpt2.cu $(NVCC_CUDNN)$(NVCC) $(NVCC_FLAGS) $(PFLAGS) $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS) $(CUDA_OUTPUT_FILE) $(NVCC_CUDNN)test_gpt2fp32cu: test_gpt2_fp32.cu$(NVCC) $(NVCC_FLAGS) $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS) $(CUDA_OUTPUT_FILE)profile_gpt2cu: profile_gpt2.cu $(NVCC_CUDNN)$(NVCC) $(NVCC_FLAGS) $(PFLAGS) -lineinfo $< $(NVCC_LDFLAGS) $(NVCC_INCLUDES) $(NVCC_LDLIBS)  $(CUDA_OUTPUT_FILE) $(NVCC_CUDNN)clean:$(REMOVE_FILES) $(TARGETS)

解读

这是一个使用 CUDA 和一些可选的其他库(如 cuDNN、OpenMPI、NCCL)的项目的 Makefile,它用于编译和链接 C 和 CUDA 程序。以下是主要部分的中文解读:
- 定义了一些变量,用于存储编译器选项(如 CFLAGS)、库(`LDLIBS`)、包含文件路径(`INCLUDES`),以及一些条件编译标志(`CFLAGS_COND`)。
- 检测系统类型,配置对应的命令和变量,比如在 Windows 系统上使用 cl 编译器和删除文件的命令。
- 通过命令查找 nvcc 编译器的路径,这是 NVIDIA 的 CUDA 编译器。
- 检查并且添加支持的编译器标志。
- 如果设置了 USE_CUDNN 变量,并且在 Linux 系统上找到了 cuDNN 库和头文件路径,那么就将 cuDNN 加入编译选项中。
- 检查 OpenMP 支持,如果支持,那么添加 OpenMP 相关的编译选项。
- 检查是否存在 OpenMPI 和 NCCL 支持,这两者用于多 GPU 训练。
- 设置精度选项,可以是 FP32(单精度)、`FP16`(半精度)或 BF16(谷歌的半精度格式)。
- 定义了一系列的伪目标(`.PHONY`),用于编译和测试不同配置下的项目。
- 根据环境配置和 nvcc 的存在与否,确定要构建的目标(`TARGETS`)。
- 最后,定义了各种编译目标的规则,用于编译和链接程序,以及一个 clean 目标用于清除生成的文件。
整个 Makefile 通过多个检测和条件判断,智能地配置了编译环境,并提供了灵活的编译选项,以便利用 CUDA 加速 GPU 编程。 

为了将上面提供的NVIDIA CUDA GPU Makefile修改为适用于AMD GPU平台的Makefile,我们需要使用AMD的ROCm工具链而不是NVIDIA的 CUDA 和 cuDNN 库。下面是如何进行一些基本转换的一个示例:

# ROCm configuration
ROCm_PATH ?= /opt/rocm
HIPCC := $(ROCm_PATH)/bin/hipcc# Common flags
CFLAGS = -O3 -Wall -Wextra
LDFLAGS =
LDLIBS = -lm# AMD GPU specific flags
HIPCC_FLAGS = -O3 --amdgpu-target=gfx803 # You might want to specify your own GPU architecture here
HIPCC_LDFLAGS =
HIPCC_INCLUDES =
HIPCC_LDLIBS =# PHONY targets - these recipes will always be run
.PHONY: all clean# Add targets
TARGETS = train_gpt2 test_gpt2all: $(TARGETS)train_gpt2: train_gpt2.cpp$(HIPCC) $(CFLAGS) $(HIPCC_INCLUDES) $(LDFLAGS) $< $(LDLIBS) -o $@test_gpt2: test_gpt2.cpp$(HIPCC) $(CFLAGS) $(HIPCC_INCLUDES) $(LDFLAGS) $< $(LDLIBS) -o $@clean:rm -f $(TARGETS)

这个示例 Makefile 使用了 hipcc 编译器,它是ROCm工具链的一部分,用以支持AMD GPU上的GPU计算。请注意以下几点:
1. $(ROCm_PATH) 为ROCm安装路径,默认通常为 /opt/rocm,但你需要根据管路上具体的安装位置进行相应调整。
2. $(HIPCC) 被设置成ROCm工具链中的 hipcc 编译器的路径。
3. 我们为 HIPCC_FLAGS 添加了一个 -O3 优化标志和一个 --amdgpu-target 参数,该参数后跟的是你期望代码运行的具体AMD GPU架构,如 gfx803。基于你使用的GPU,你可能需要更改这个参数。
4. 所有原有的CUDA相关变量和规则(例如 NVCC_FLAGS、`NVCC_LDLIBS`、`cudnn_att.o`、`train_gpt2cu` 等)都被移除或替换为适合AMD平台的变量和规则。
5. 目标名称(train_gpt2、test_gpt2等)和源文件名现在反映了其作为C++源的性质。
6. 由于AMD GPU不支持cuDNN,所以我们移除了所有与cuDNN相关的配置项。
对于其他使用了 (CUDA_)OUTPUT_FILE 和 REMOVE_FILES 变量的规则,需要根据上下文具体情况进行必要的调整。
这个Makefile还十分简化,以说明AMD GPU 平台的CPU/GPU编译过程。在实际情况中,你可能需要进一步适应其他库的链接(例如 ROCm 的 rocBLAS、`MIOpen` 等等),并进行跟你的应用相关的其他调整。请参照ROCm官方文档获取更多信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot项目打包部署

springboot打包的前提条件jdk必须17以后不然本地运行不来&#xff08;我用的jdk是22&#xff09; 查看自己电脑jdk版本可以参考&#xff08;完美解决Windows10下-更换JDK环境变量后&#xff0c;在cmd下执行仍java -version然出现原来版本的JDK的问题-CSDN博客&#xff09; 1、…

六级翻译笔记

理解加表达 除了专有名词不能自己理解翻译&#xff0c;其它都可以 时态一般唯一 题目里出现有翻译为 客观存在&#xff1a; there be 单词结尾加er和ee的区别&#xff1a;er是主动&#xff0c;ee是被动 中文句子没有被动&#xff0c;也可以英文翻译为被动 中文的状语可以不是…

【无标获取S4与ECC的具体差异的方法题】

首先我们需要对ECC vs S4的差异这个课题要有一个深刻的理解&#xff0c;这不是一个简单并能准确说清楚的课题。 我们需要结合实际项目的具体情况去回答这个问题&#xff0c;因为这个问题本身是没有标准答案的。 首先要了解SAP本身ERP产品线的发展概况&#xff0c;其次我们要…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

C语言 | Leetcode C语言题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; int largestRectangleArea(int* heights, int heightsSize) {int st[heightsSize];int p[2];p[0]-1,p[1]heightsSize;int size0,result0;st[size]0;for(int i1;i<heightsSize;i){ while(size!0&&heights[i]<heights[st[size-1…

动态规划解决回文子串问题

前言&#xff1a; 回文串相关问题在我们的算法题中算是老生常谈&#xff0c;本文主要介绍如何使用动态规划的思路去解决回文串系列问题。 总体思路&#xff1a; 能够将所有的子串是否是回文的信息&#xff0c;存储在二维dp表中。有了这个dp表&#xff0c;就可以将hard难度转…

【实战】采用jenkins pipeline实现自动构建并部署至k8s

文章目录 前言部署jenkins编写docker-compose-jenkins.yaml配置maven源启动jenkins解锁jenkins Jenkins默认插件及git、镜像仓库、k8s凭证配置host key verification configuration修改为不验证Gitee ssh阿里云镜像仓库ssh编写pipeline安装以下常用插件将kubectl命令文件拷贝到…

E - Yet Another Sigma Problem(ABC字典树)

思路&#xff1a;我们可以发现两个字符串的最长公共前缀就是字典树中的最近公共祖先。然而这道题&#xff0c;比如说某个结点是x个字符串的前缀&#xff0c;那么当前结点对答案的贡献为x * (x - 1) / 2&#xff0c;就是x中任选两个字符串组合&#xff0c;因为在这之前&#xff…

【Win10设备管理器中无端口选项】

计算机疑难杂症分享002 Win10设备管理器中无端口选项1、问题现象2、问题原因3、问题解决3.1、驱动精灵(亲测的此方法)3.2、添加过时硬件3.3、官方的方法 Win10设备管理器中无端口选项 1、问题现象 当我调试串口通信时&#xff0c;发现打开设备管理器没有端口&#xff0c;打开…

Docker停止不了

报错信息 意思是&#xff0c;docker.socket可能也会把docker服务启动起来 解决 检查服务状态 systemctl status dockersystemctl is-enabled docker停止docker.socket systemctl stop docker.socket停止docker systemctl stop docker知识扩展 安装了docker后&#xff0c;…

[ue5]编译报错:使用未定义的 struct“FPointDamageEvent“

编译报错&#xff0c;错误很多&#xff0c;但很明显核心问题是第一个&#xff1a;使用未定义的 struct“FPointDamageEvent“&#xff1a; 程序没有找到FPointDamageEvent的定义。 解决办法&#xff1a; 处理这类未定义都可以先F12&#xff0c;找到它的库位置&#xff0c;之后…

部署yolov5

1 创建一个yolov5的环境 conda create -n yolov5 python3.8 2 激活环境 conda activate yolov5 3 设置清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 4 PyTorch 网站下载pytorch 备注:也可以使用pip install 5 下载 yolov5…

数据可视化训练第四天(模拟投掷筛子并且统计频次)

投掷一个筛子 import matplotlib.pyplot as plt from random import randint import numpy as npclass Die:"""模拟投掷筛子"""def __init__(self,num_sides6):self.num_sidesnum_sidesdef roll(self):return randint(1,self.num_sides)num1000…

泰迪智能科技大数据开发实训平台功能介绍

大数据开发实训平台是面向实训课和课后训练的编程实训平台&#xff0c;平台底层基于Docker技术&#xff0c;采用容器云部署方案&#xff0c;预装大数据相关课程教学所需的实训环境&#xff0c;拥有1主2从的Hadoop集群&#xff0c;还能够自主定制环境&#xff0c;并能够与实训管…

Java | Leetcode Java题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode deleteDuplicates(ListNode head) {if (head null) {return head;}ListNode cur head;while (cur.next ! null) {if (cur.val cur.next.val) {cur.next cur.next.next;} else {cur cur.next;}}return…

C++调用有依赖库的python函数(VS2017+WIN10+Anaconda虚拟环境)

情况1.在写的函数中依赖了能够pip的库&#xff0c;例如numpy库、torch库,见下面的函数&#xff1a; import numpy as np import torch def add1(a, b):# 确保a和b都是NumPy数组a_array np.array(a) if not isinstance(a, np.ndarray) else ab_array np.array(b) if not isins…

萤火虫优化算法(Firefly Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 萤火虫优化算法&#xff0c;是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁…

Blender细节补充

1.饼状菜单&#xff0c;用于快速切换/选择 例如&#xff1a; ~&#xff1a;切换视图 Z&#xff1a;切换着色方式 &#xff0c;&#xff1a;切换坐标系 .&#xff1a;切换基准点 Shift S&#xff1a;吸附 有两种使用方式&#xff1a; -点选 -滑选&#xff0c;按快捷键…

表的创建与操作表

1. 创建表 创建表有两种方式 : 一种是白手起家自己添&#xff0c;一种是富二代直接继承. 2. 创建方式1 (1). 必须具备条件 CREATE TABLE权限存储空间 (2). 语法格式 CREATE TABLE IF NOT EXISTS 表名(字段1, 数据类型 [约束条件] [默认值],字段2, 数据类型 [约束条件] [默…

node pnpm修改默认包的存储路径

pnpm与npm的区别 PNPM和NPM是两个不同的包管理工具。 NPM&#xff08;Node Package Manager&#xff09;是Node.js的官方包管理工具&#xff0c;用于安装、发布和管理Node.js模块。NPM将包安装在项目的node_modules目录中&#xff0c;每个包都有自己的依赖树。 PNPM&#xf…