如何监控模型推理时的系统状态信息
在使用训练好的深度学习模型进行推理时,为了了解推理过程中所使用的系统资源信息,如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 map是q和k的事,k又是一个全局的encoder的输出,q序列的每一个位置的token都可以访问它,不需要担心未来 ...
Python-Flask快速上手
在训练好深度学习模型后,可以使用Python的Flask框架快速搭建一个服务,用于模型效果的展示
最近遇到了这个需求,于是在网络上找到了一些资料(主要参考了台大-彭老师的视频),对Flask的基础内容进行了整理总结成此文
下面正文开始
1. URL的组成与运作方式组成通讯协议://主机名称:端口号/路径?要求字串
比如:
https://www.google.com/search?q=test
其中的“要求字串”允许省略,上述例子中的“端口号”省略不写,实际上使用的是默认值
通讯协议:通过后端以及网络环境决定使用http或https
主机名称:购买域名,设定dns记录,应用AWS云端服务决定主机名称
端口号:通过后端程序或设定档决定
路径:通过后端程序或设定档决定
要求字串:通过后端程序决定运作方式浏览器前端根据通讯协议,主机名称、端口号连接到网络上的服务器,服务器根据路径,要求字串决定要采取的动作,并回传给前端
2. 路由基础基本路由决定后端程序要支援的路径
比如
123@app.route("/data"):def getData(): return ...
图像配准小结
更好的阅读体验,请移步微信公众号:
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 \ 1\end{bmatrix}]
[p’=\begin{bmatrix} x’ \ ...
将SAM编码器迁移到自定义分割子任务中
Segment Anything Model(SAM)是META在今年发布的通用分割大模型。
鉴于ChatGPT可以将自然语言等形式的信息作为提示(prompt)输入到模型中,SAM将这一思想应用到了计算机视觉领域的语义分割任务中。
具体来说,在以前的语义分割方法中,网络的输入通常是待分割的图像,因而网络通常是一个由图像编码器和图像解码器组成的Encoder-Decoder架构,而在SAM中,多了一个提示编码器,可以将额外的提示信息也输入到网络中,同时依托强大的数据引擎生成大量数据集进行训练,使得网络能够对任一图像中可能的目标进行分割。
既然SAM是在海量数据上训练得到的,那么根据以往的迁移学习思路,我们可以将其预训练权重迁移到自己的任务中。
首先看一下SAM的网络结构:
其中:
image encoder: 一个图像编码器,用于提取输入图像的特征,SAM中使用的是ViT;
prompt encoder: 一个提示编码器,用于将输入的提示信息进行编码,这里的提示有多种形式,可以是文字(text),可以是边界框(boxes),可以是点(points),还可以是masks,当然也可以同 ...
ViT预训练权重迁移-实现任意尺寸输入
在将基于transformer的视觉模型(比如 ViT, Swin Transformer等)迁移到自己的数据集上进行微调时,往往需要使得自己的数据集中图像尺寸和这些模型的输入图像尺寸一致,这些模型常见的输入尺寸为224x224,284x284,768x768等。
然而,如果自己的数据集中图像尺寸比较大,比如1024x1024,直接resize为224x224等低分辨率图像会造成信息损失。
能不能在迁移预训练权重的同时,使得模型能够适应任意尺寸的输入呢?可以。
接下来以ViT为例,首先通过实验探究一下出现这种限制的原因,然后给出解决方案。
ViT模型定义如下:
12345678model=VisionTransformer( image_size=[224,224],# 预训练模型的输入图像尺寸 patch_size=16, n_layers=1, d_model=768,# token 维度 d_ff=2, n_heads=8, n_cls=99,).cuda()
假设这个ViT已经在大规模数据集上完成了训练,并且训练时的输入图像尺寸为224 ...
如何将PyTorch权重转换成TensorRT的engine
假设你已经训练好了一个基于PyTorch的神经网络模型MyModel,本文将一步一步演示如何将其转换到TensorRT的engine格式,实现高性能模型推理。
代码复制可用,建议收藏~
1. 加载模型权重直接加载训练好的PyTorch权重即可:
12model=MyModel(in_channel=3,out_channel=1)model.load_state_dict(torch.load('my_model.pth'))
2. PyTorch权重转换到ONNXPyTorch本身已经提供了转换接口torch.onnx.export,所以转换起来也很容易:
12345model.cuda()model.eval()dummy_input = torch.randn(1,3, 512,512).cuda()torch.onnx.export(model, dummy_input, "onnx.onnx", opset_version=11,input_names = ['input'],output_names = [ ...
AI绘画的基石-DDPM
在AI绘画发展历程中,涌现了多种不同的生成模型和算法,其中DDPM(Denoising Diffusion Probabilistic Model)是一种比较有效的图像生成模型之一,也是最近比较热门的AI绘画模型所采用的技术。DDPM的设计巧妙,可以从高斯噪声中生成高逼真度的图像。
DDPM相对于当前诸如stable difussion等AI绘画模型来说,扮演着类似于GAN相对于StyleGAN等模型的角色
因此,DDPM并不是特指某个网络结构,而是一种通用的训练思路
这几天结合着Hung-yi Lee的视频对DDPM的优化目标推导过程进行了梳理,在此记录下,以下是正文内容。
最大化似然函数可以等价于最小化KL散度,因此在生成模型(VAE, DM, Flow)中,目标函数通常使用最大似然函数
VAE的目标是最大化$logP_\theta{(x)}$,而$logP_\theta{(x)}$有下界,所以上述目标等价于最大化这个下界。
下界推导:
在VAE中,$q(z|x)$对应Encoder,也就是在给定输入的训练集x的情况下,得到一个隐向量z。
DDPM要优化的目标函数和VAE是类似的 ...
经典目标检测
RCNN首先,使用Selective Search算法,从图片中裁出来N个小区域图像
然后将者N个小区域图像分别使用CNN提取得到D维的特征向量。至此得到了NxD的矩阵,该矩阵包含每个小区域对应的D维特征向量
接着,将NxD的矩阵分别使用k个SVM分类器(Dxk)进行分类,得到Nxk的矩阵,即每个小区域图像的分类结果(k个类别,取概率最大的作为预测类别)。在得到每个小区域图像的预测类别后,可能存在同一个目标被多个小区域图片同时预测到的情况,因此还需要针对每个类别对应的小区域图像做一个NMS后处理。
最后,对于NMS后保留下来M(M<=N)个的小区域图像,先按照这些建议框(小区域图像)与GT之间的IoU做一个过滤,保留IoU大于阈值的建议框,然后将每个建议框对应的D维特征向量输入回归器,得到修正后的建议框位置。这里,和分类器个数一样,总共设置了k个回归器,各自负责不同类别(上一步预测得到的类别)的建议框位置修正。
RCNN存在的问题:
测试速度慢(SS算法提取候选框很慢)
训练速度慢(CNN,SVM分类器,回归器)
训练所需空间大(需要将目标框的小区域提取特征并写入磁盘)
Fa ...
chatGPT是怎样炼成的
chatGPT会写作业,写代码,写文案,写提示词喂给AI绘画模型来作画,各种各样的玩法,使得chatGPT成为了一个”得力助手”,微软也在自家的搜索引擎Bing中引入了chatGPT,大有要引领搜索引擎新未来的趋势,chatGPT(或者类似的模型)正逐步走向大众视野。
在体验过chatGPT后,可以明显感觉到,对方不再像是各大手机厂商的智能语音助手,而是一个可以结合对话上下文语境实现真正连续对话的”机器人”。
是什么使得chatGPT脱颖而出呢?
这还要从许多年前讲起。
chatGPT的前身是GPT模型,GPT的全称是Generative Pre-trained Transformer,这是一种生成模型,采用自回归的方式来不断的生成新的内容:
$$P_{\theta}(x_{t+1}|x_1,x_2,…,x_{t})$$
将上式中的$x$看作是模型生成的字,那么$x_i$就表示模型生成的第$i$个字,在生成第$t+1$个字时,模型需要将${x_i}^{t}_{i=1}$作为输入。
可以看到,在模型的一次预测中,后面文字的生成依赖于之前生成的内容,chatGPT也继承了这一特点,这也是为 ...