从tokenizer说起,为LLM自回归预训练准备数据集-大模型炼丹术(一)
本文首先介绍了如何从头开始实现一个自定义tokenizer,用于将原始文本数据转化为模型能够理解的格式。通过这个例子,来直观理解什么是tokenize;接着,分析这种tokenizer的优缺点,引出更常用的BPE;最后,基于BPE构建的tokenizer,构建用于GPT预训练时的数据加载器。 在阅读完本文后,你将学会如何构建用于GPT自回归预训练阶段的数据加载器,这将是你向着LLM训练迈出的第一步! 一、先动手,编写自定义tokenizerstep1. 读取语料读取the-verdict.txt: 12345with open("the-verdict.txt", "r", encoding="utf-8") as f: raw_text = f.read() print("Total number of character:", len(raw_text))print(raw_text[:99]) 输出: 12Total number of character: 20479I HAD...
把数据预处理搬到GPU-英伟达DALI加速数据预处理
在执行模型前向推理时,往往涉及到一些列数据预处理操作,比如Resize,Normalize等,这些操作通常在CPU上完成,然后CPU将预处理后的图片传送到GPU上执行推理。 由于GPU的运算速度远快于CPU,所以能不能将这些数据预处理操作放到GPU上执行从而加快数据加载的速度呢? NVIDIA DALI 可以! NVIDIA DALI (Data Loading Library) 是一个加速数据加载和预处理的库,专为深度学习任务设计。它能将图像和视频的复杂预处理操作(尤其是在模型训练阶段,通常涉及大量的数据增强预处理操作)从 CPU 转移到 GPU 上,从而减少数据加载瓶颈,提升 GPU 的利用率。DALI 支持多种格式(如 JPEG、PNG、TFRecord 等),并能与主流深度学习框架(如 PyTorch 和 TensorFlow)无缝集成,使得数据预处理和模型前向推理可以高效并行进行。 本文介绍DALI的使用方法,以及如何将PyTorch的数据加载器替换成DALI的数据加载器,并测试加速效果。 安装NVIDIA DALI对于CUDA 11.x,执行如下命令行: 1pip...
万字长文入门扩散模型
扩散模型问世至今,因其训练过程的稳定性和生成样本的多样性,受到了广泛的关注和应用,相应的开源社区贡献的工具链也趋向于更易用,HuggingFace的diffusers库便是其中之一。 diffusers提供了非常简洁和直观的API接口,能够让研究人员和开发者快速实现扩散模型的训练和推理。即便是对扩散模型不太熟悉的用户,也能通过少量的代码实现高效的图像生成任务。 本文基于diffusers,包含如下内容: 1.通过一个简易demo来直观感受使用diffusers中的快速生图的方法 2.使用smithsonian_butterflies_subset数据集,通过diffusers来搭建一个完整的图像生成小项目,包括数据集准备、模型训练、模型推理等步骤 3.介绍如何基于已有的预训练权重,通过微调和引导技术,来控制生成图片整体的细节走向,如颜色偏好,内容偏好等 4.介绍火出圈的StableDiffusion 5.介绍DDIM反转,用于控制图像的局部区域生成细节走向,该技术极大地提高了扩散模型的可玩性 零....
使用原生TensortRT-API加速推理
Polygraphy 是构建在 TensorRT API 之上的高级工具,简化了一些常见的操作,特别是模型转换、性能分析和调试。Polygraphy 提供了更高层次的抽象,使得许多复杂的操作更加简便和自动化。在上一篇文章中,我们已经基于Polygraphy实现了对于PyTorch模型–>TensorRT的推理加速。 然而,原生的TensorRT API提供了更低层的 API,允许用户对引擎的每一步(包括构建、优化、推理)进行更细致的控制。因此,本文将使用原生的TensorRT API,重新梳理将PyTorch模型转换为TensorRT的详细步骤。 本文目标基于官方的demo,将FC-ResNet101的PyTorch模型转换为TensorRT 的engine,演示如何使用原生TensorRT API而非Polygraphy实现PyTorch模型的推理加速。 操作步骤step1. 环境搭建在上一篇环境搭建的基础上,需要额外安装pycuda工具包: 1pip install pycuda step2. 执行转换step2.1...
如何监控模型推理时的系统状态信息
在使用训练好的深度学习模型进行推理时,为了了解推理过程中所使用的系统资源信息,如CPU利用率、GPU利用率等,往往需要一个监控工具。 对于CPU利用率,可以使用psutil库获取: 1psutil.cpu_percent(interval=1, percpu=False) 封装成函数: 12345678def get_cpu_utilization(): try: cpu_utilization = psutil.cpu_percent(interval=1, percpu=False) return cpu_utilization except Exception as e: print(f"Error while fetching CPU utilization: {e}") return [] 对于GPU利用率,可以使用命令行工具 nvidia-smi获取,封装成函数: 12345678910def get_gpu_utilization(): try: ...
Transformer的Decoder在训练和推理阶段的异同点总结
在训练阶段,decoder的输入是(seq_length,)的目标序列,也就是训练数据集中的GT,经过OutputEmbedding层和PositionalEmbedding层得到(seq_length,model_dim)的序列。 接下来这个序列会经过一个MHA层,对应的q、k和v都是刚才得到的序列本身,此时如果直接计算注意力,那么序列中每一个词既能看到它前面的词的信息,又能看到它后面的词的信息,这样容易导致模型就不学习了,因为在推理阶段,模型是一个词一个词的采用一种自回归方式进行预测的,如果训练时模型已经看到了其所在序列位置后面的词的信息,那么直接读取这些词就好了,无需学习。 因此,需要对q和k计算得到的attention map添加一个mask操作,以保证序列中的每一个词只能看到位于其前面的词的信息。 在走完第一个MHA层之后,还有第二个MHA层,只不过,这里的k和v来自encoder的输出,q来自decoder刚刚上一个MHA层的输出,而计算attention...
Python-Flask快速上手
在训练好深度学习模型后,可以使用Python的Flask框架快速搭建一个服务,用于模型效果的展示 最近遇到了这个需求,于是在网络上找到了一些资料(主要参考了台大-彭老师的视频),对Flask的基础内容进行了整理总结成此文 下面正文开始 1. URL的组成与运作方式组成通讯协议://主机名称:端口号/路径?要求字串 比如: https://www.google.com/search?q=test 其中的“要求字串”允许省略,上述例子中的“端口号”省略不写,实际上使用的是默认值 通讯协议:通过后端以及网络环境决定使用http或https 主机名称:购买域名,设定dns记录,应用AWS云端服务决定主机名称 端口号:通过后端程序或设定档决定 路径:通过后端程序或设定档决定 要求字串:通过后端程序决定 运作方式浏览器前端根据通讯协议,主机名称、端口号连接到网络上的服务器,服务器根据路径,要求字串决定要采取的动作,并回传给前端 2. 路由基础基本路由决定后端程序要支援的路径 比如 123@app.route("/data"):def...
图像配准小结
更好的阅读体验,请移步微信公众号: https://mp.weixin.qq.com/s?__biz=MzU0NzQwMzU1Mw==&mid=2247488765&idx=1&sn=0e7010528fad44ea9fb8cf11493e99da&chksm=fb4fb6b3cc383fa56479dae2e495e80237295356fdd53f16b412d223051bab09e91b394a369f&token=654252831&lang=zh_CN#rd 前置基础:三种图像变换刚体变换刚体变换包括平移和旋转操作,而不会产生形变。 假设某个像素点坐标为$(x,y)$,将其分别在x和y方向上平移了$t_x$和$t_y$,并且绕原点逆时针旋转了$\theta$度,变换后的像素点坐标记作$(x’,y’)$,对应的刚体变换可以用矩阵表示如下:$$p’=M p$$ 其中,[p=\begin{bmatrix} x \ y \ ...
将SAM编码器迁移到自定义分割子任务中
Segment Anything Model(SAM)是META在今年发布的通用分割大模型。 鉴于ChatGPT可以将自然语言等形式的信息作为提示(prompt)输入到模型中,SAM将这一思想应用到了计算机视觉领域的语义分割任务中。 具体来说,在以前的语义分割方法中,网络的输入通常是待分割的图像,因而网络通常是一个由图像编码器和图像解码器组成的Encoder-Decoder架构,而在SAM中,多了一个提示编码器,可以将额外的提示信息也输入到网络中,同时依托强大的数据引擎生成大量数据集进行训练,使得网络能够对任一图像中可能的目标进行分割。 既然SAM是在海量数据上训练得到的,那么根据以往的迁移学习思路,我们可以将其预训练权重迁移到自己的任务中。 首先看一下SAM的网络结构: 其中: image encoder: 一个图像编码器,用于提取输入图像的特征,SAM中使用的是ViT; prompt encoder:...