前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 CMake + Git Submodule 方式管理项目三方库

使用 CMake + Git Submodule 方式管理项目三方库

作者头像
我与梦想有个约会
发布于 2023-10-21 07:33:55
发布于 2023-10-21 07:33:55
87500
代码可运行
举报
文章被收录于专栏:jiajia_dengjiajia_deng
运行总次数:0
代码可运行

在项目开发过程中,避免不了要使用一些开源的三方库,我参加过的一些团队有不同的管理三方库的方式。不同的方式都各有优缺点,我们先列举一下碰到过的管理方式,说一些他们的优缺点,最后再来讨论我们今天介绍的管理方式弥补了哪些缺点。

统一管理三方库

一些团队是直接将三方库编译好放到 CI 机器上,在本地开发或者 CI 出项目的 Release 包时去做依赖拷贝。这样做有以下几点好处:

  1. 三方库不需要每次都重新编译,需要时拷贝,包括符号调试文件也可以一并维护。
  2. 大家公用一份三方库,确保三方库的出处都是一样的。

但是这样管理也有一些不足。

  1. 如果不同的项目需要依赖不同版本、不同分支的三方库,则统一的管理无法满足需求
  2. 三方库的版本管理迭代会保留诸多历史文件,一旦历史版本被清理则很难追溯历史缺陷的符号调试文件

上传三方库文件到 Git 中

编译好直接上传到项目的仓库中,这种方式有一些好处,比如:

  1. 工程下载下来不需要多余配置,启动 IDE 直接编译不废话。
  2. 自己想依赖什么版本就什么版本,不受限于其他项目

当然缺点显而易见:

  1. 静态库文件编译后非常大,上传到 Git 仓库中仓库会异常庞大,特别是三方库二进制文件的更新。
  2. 这种形式很容易出现源码和三方库文件不匹配的情况,这个项目编译好的复制到其他项目直接用,管理混乱。
  3. 跨平台项目要上传不同平台的三方库二进制文件到工程中

使用 CMake + Git Submodule 形式管理

通过以上的描述,我们已经很容易能看清楚不同的管理方式的优劣了。本文推荐的方法可以弥补一些上面方式的不足,但可能也因不同团队而异。推荐的方式大概分以下步骤。

  1. 将你需要依赖的三方库设置为 Git Submodule,每个项目可以依赖不同版本的三方库,不需要上传二进制文件。
  2. 脚本利用 CMake 自动编译三方库工程,不同平台可以使用 CMake 自动编译,不需要单独维护个别版本。
  3. CI 出 Release 时自动编译三方库并保留匹配版本的调试符号文件,和本地源码原始匹配不易混乱。

我们以一个 libyuv 三方库举例。首先将项目添加为 Git Submodule

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git submodule add https://chromium.googlesource.com/libyuv/libyuv third_party/libyuv

添加完成后,我们写一个自动编译三方库的脚本,Windows 平台下使用批处理、macOS 下使用 Shell 脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Windows: Generate visual studio solution
cmake -H. -Boutput -G"Visual Studio 15 2017"
# Build release library
cmake --build output --config Release --target yuv
# Build debug library
cmake --build output --config Debug --target yuv
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# macOS: Generate makefile
cmake -H. -DCMAKE_MACOSX_RPATH=OFF -DCMAKE_BUILD_TYPE=Release -Boutput -G"Unix Makefiles"
# Static library
cmake --build output --target yuv

这样在不同平台我们就可以自动编译三方库二进制文件了,本地开发时只需要将 Submodules 更新下来,头文件和库文件路径都修改为三方库文件的路径。CI 出 Release 包时也是先将 Submodules 更新下来编译后再编译项目主体。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用HAI,基于PyTorch 实现一个基于 Transformer 架构的字符级语言模型
这篇教程将带你一步步在 JupyterLab 中实现一个简单的语言模型。我们将从零开始,使用 PyTorch 实现一个基于 Transformer 架构的字符级语言模型。尽管在实际应用中,大多数人更倾向于使用 Hugging Face 的预训练模型,但本文的目的是让你了解语言模型的基本原理和实现步骤。接下来,我们会讲解数据预处理、模型构建、训练过程以及如何利用模型生成文本,每个环节都附有详细的代码和解释,力求让内容通俗易懂。
不惑
2025/03/26
2970
使用HAI,基于PyTorch 实现一个基于 Transformer 架构的字符级语言模型
十分钟读懂旋转编码(RoPE)
旋转位置编码(Rotary Position Embedding,RoPE)是论文 Roformer: Enhanced Transformer With Rotray Position Embedding 提出的一种能够将相对位置信息依赖集成到 self-attention 中并提升 transformer 架构性能的位置编码方式。而目前很火的 LLaMA、GLM 模型也是采用该位置编码方式。
zenRRan
2023/09/11
6K0
十分钟读懂旋转编码(RoPE)
ChatGLM3 源码解析(三)
ApacheCN_飞龙
2024/03/08
4240
Llama深入浅出
前方干货预警:这可能是你能够找到的最容易懂的最具实操性的学习开源LLM模型源码的教程。
lyhue1991
2023/09/05
2.4K1
Llama深入浅出
Deepseek-V2技术报告解读!全网最细!
深度求索Deepseek近日发布了v2版本的模型,沿袭了1月发布的 Deepseek-MoE(混合专家模型)的技术路线,采用大量的小参数专家进行建模,同时在训练和推理上加入了更多的优化。沿袭了一贯的作风,Deepseek对模型(基座和对话对齐版本)进行了完全的mit协议开源,可以商用。对于算力不是那么充足的开发者,官方提供了API调用的方案,费用更是达到了全场最低!
zenRRan
2025/02/03
1.1K0
Deepseek-V2技术报告解读!全网最细!
Llama也中招,混合精度下位置编码竟有大坑,百川智能给出修复方案
位置编码技术是一种能够让神经网络建模句子中 Token 位置信息的技术。在 Transformer 大行其道的时代,由于 Attention 结构无法建模每个 token 的位置信息,位置编码(Position embedding) 成为 Transformer 非常重要的一个组件。研究人员也提出了各种各样的位置编码方案来让网络建模位置信息,Rope 和 Alibi 是目前最被广泛采纳的两种位置编码方案。
机器之心
2023/09/08
6960
Llama也中招,混合精度下位置编码竟有大坑,百川智能给出修复方案
机器学习|从0开发大模型之模型预训练
继续写《从0开发大模型》系列文章,本文主要介绍预训练过程。 预训练是目的是让模型学习知识,需要将预处理的数据(《机器学习|从0开发大模型之数据预处理》)中生成的 pretrain_data.bin 文件的上下文全部学习到,那预训练怎么做呢?
用户1904552
2025/02/27
1470
机器学习|从0开发大模型之模型预训练
聊聊 从源码来看ChatGLM-6B的模型结构
ChatGLM是transformer架构的神经网络模型,因此从transformer结构入手,分析其源码结构。 transformer结构:
Ryan_OVO
2024/01/07
2.2K0
聊聊 从源码来看ChatGLM-6B的模型结构
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
深度学习领域所谓的“模型”,是一个复杂的数学公式构成的计算步骤。为了便于理解,我们以一元一次方程为例子解释:
汀丶人工智能
2024/05/26
1.4K0
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
ChatGLM3 源码解析(一)
ApacheCN_飞龙
2024/03/05
5730
位置编码
在transformer中使用了位置编码,为什么需要位置编码。因为对于transformer中的注意力机制而言,交换两个单词,并不会影响注意力的计算,也就是说这里的注意力是对单词位置不敏感的,而单词之间的位置信息往往是很重要的,因此考虑使用位置编码。
西西嘛呦
2022/05/10
2.5K0
【LLM系列之PaLM】PaLM: Scaling Language Modeling with Pathways
PaLM 在decoder-only架构中使用标准的 Transformer 模型架构(即每个时间步只能关注其自身和过去的时间步),并进行以下修改: (1)采用SwiGLU激活函数:用于 MLP 中间激活,因为与标准 ReLU、GELU 或 Swish 激活相比,《GLU Variants Improve Transformer》论文里提到:SwiGLU 已被证明可以显著提高模型效果。
致Great
2023/08/25
9510
【LLM系列之PaLM】PaLM: Scaling Language Modeling with Pathways
一文看懂 LLaMA 中的旋转式位置编码(Rotary Position Embedding)
旋转式位置编码(RoPE)最早是论文[1]提出的一种能够将相对位置信息依赖集成到 self-attention 中并提升 transformer 架构性能的位置编码方式。而目前很火的 LLaMA 模型也是采用该位置编码方式。
BBuf
2023/08/22
5.3K0
一文看懂 LLaMA 中的旋转式位置编码(Rotary Position Embedding)
ChatGLM2 源码解析:`ChatGLMModel`
ApacheCN_飞龙
2023/10/13
5410
ChatGLM2 源码解析:`ChatGLMModel`
多模态大模型篇
在CV方向上,一般我们输入的都是图片,无论这个图片多大,都会resize到一个统一的尺寸。最终经过CNN的提取,变成一个特征向量,那么这个特征向量的维度是一样的。再经过softmax变成一个分类(Class)的概率
算法之名
2023/10/16
9650
多模态大模型篇
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
这里提一下,我维护的几个记录个人学习笔记以及社区中其它大佬们的优秀博客链接的仓库都获得了不少star,感谢读者们的认可,我也会继续在开源社区多做贡献。github主页:https://github.com/BBuf ,欢迎来踩
BBuf
2024/06/18
2.7K0
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
【LLM系列之LLaMA】LLaMA: Open and Efficient Foundation Language Models
LLaMA 是 Meta AI 发布的包含 7B、13B、33B 和 65B 四种参数规模的基础语言模型集合,LLaMA-13B 仅以 1/10 规模的参数在多数的 benchmarks 上性能优于 GPT-3(175B),LLaMA-65B 与业内最好的模型 Chinchilla-70B 和 PaLM-540B 比较也具有竞争力。
致Great
2023/08/25
1K0
【LLM系列之LLaMA】LLaMA: Open and Efficient Foundation Language Models
大模型部署框架 FastLLM 实现细节解析
以chatglm-6b的支持为例,函数入口在 https://github.com/ztxz16/fastllm/blob/master/src/models/chatglm.cpp#L626 ,这里的 input 就是输入的 context(string类型)。然后 https://github.com/ztxz16/fastllm/blob/master/src/models/chatglm.cpp#L633 这行代码对 input 进行 tokenizer encode并构造好inputIds,再构造好attentionMask之后就可以给Forward函数推理,拿到推理结果之后再使用tokenizer进行decode得到输出。
BBuf
2023/08/22
1.2K0
大模型部署框架 FastLLM 实现细节解析
【LLM系列之底座模型对比】LLaMA、Palm、GLM、BLOOM、GPT模型结构对比
GPT 使用 Transformer 的 Decoder 结构,并对 Transformer Decoder 进行了一些改动,原本的 Decoder 包含了两个 Multi-Head Attention 结构,GPT 只保留了 Mask Multi-Head Attention,如下图所示:
致Great
2023/08/25
1.2K0
【LLM系列之底座模型对比】LLaMA、Palm、GLM、BLOOM、GPT模型结构对比
机器学习|从0开始大模型之位置编码
上一篇完成DPO的训练,但是模型的输出效果不好,因此在找原因,于是将理论重新过一遍,以发现每个环节需要优化的地方,本文就是理论知识:《Transformer模型中的位置编码》。
用户1904552
2025/02/27
1610
机器学习|从0开始大模型之位置编码
推荐阅读
相关推荐
使用HAI,基于PyTorch 实现一个基于 Transformer 架构的字符级语言模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验