写在前面
“【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试经验,力求让读者在获得心仪offer的同时,增强技术基本面。
”
WeThinkIn最新福利放送:大家只需关注WeThinkIn公众号,后台回复“简历资源”,即可获取包含Rocky独家简历模版在内的60套精选的简历模板资源,希望能给大家在AIGC时代带来帮助。
Rocky最新发布Stable Diffusion 3和FLUX.1系列模型的深入浅出全维度解析文章,点击链接直达干货知识:https://zhuanlan.zhihu.com/p/684068402
大家好,我是Rocky。
又到了定期阅读《三年面试五年模拟》文章的时候了!本周期共更新了80多个AIGC面试高频问答,依旧干货满满!诚意满满!
《三年面试五年模拟》系列文章帮助很多读者获得了心仪的算法岗offer,收到了大家的很多好评,Rocky觉得很开心也很有意义。
在AIGC时代到来后,Rocky对《三年面试五年模拟》整体战略方向进行了重大的优化重构,在秉持着Rocky创办《三年面试五年模拟》项目初心的同时,增加了AIGC时代核心的版块栏目,详细的版本更新内容如下所示:
整体架构:分为AIGC知识板块和AI通用知识板块。 AIGC知识板块:分为AI绘画、AI视频、大模型、AI多模态、数字人这五大AIGC核心方向。 AI通用知识板块:包含AIGC、传统深度学习、自动驾驶等所有AI核心方向共通的知识点。
Rocky已经将《三年面试五年模拟》项目的完整版构建在Github上:https://github.com/WeThinkIn/Interview-for-Algorithm-Engineer/tree/main,本周期更新的80+AIGC面试高频问答已经全部同步到项目中了,欢迎大家star!
本文是《三年面试五年模拟》项目的第二十六式,考虑到易读性与文章篇幅,Rocky本次只从Github完整版项目中摘选了2024年11月4号-2024年11月17号更新的部分高频&干货面试知识点和面试问题,并配以相应的参考答案(精简版),供大家学习探讨。
在《三年面试五年模拟》版本更新白皮书,迎接AIGC时代中我们阐述了《三年面试五年模拟》项目在AIGC时代的愿景与规划,也包含了项目共建计划,感兴趣的朋友可以一起参与本项目的共建!
《三年面试五年模拟》系列将陪伴大家度过整个AI行业的职业生涯,并且让大家能够持续获益。
So,enjoy(与本文的BGM一起食用更佳哦):
正文开始
目录先行
AI绘画基础:
介绍一下Stable Diffusion 3中的VAE模型
介绍一下FLUX.1系列中的VAE模型
AI视频基础:
Sora的扩散模型部分架构是什么样的?
CogVideoX的扩散模型部分架构是什么样的?
深度学习基础:
AI模型训练过程的可视化实用工具有哪些?
介绍一下schedule_free优化器的原理
机器学习基础:
介绍一下机器学习中的MSE损失函数
如何在AI模型中加入先验知识?
Python编程基础:
介绍一下Python的自省特性
python中RGBA图像和灰度图如何相互转化?
模型部署基础:
有哪些常见的AI模型分布式训练方式?
有哪些常见的AI模型分布式推理方式?
计算机基础:
介绍一下CPU核数与程序进程数设置之间的关系
介绍一下CPU核数与程序线程数设置之间的关系
开放性问题:
AI算法工程师在从事技术管理时该如何与不同部门协作?
如何针对AI业务的优先级进行轻重缓急排序?
AI绘画基础
【一】介绍一下Stable Diffusion 3中的VAE模型
VAE(变分自编码器,Variational Auto-Encoder)模型在Stable Diffusion 3(SD 3)中依旧是不可或缺的组成部分,Rocky相信不仅在SD 3模型中,在AIGC时代的未来发展中VAE模型也会持续发挥价值。
到目前为止,在AI绘画领域中关于VAE模型我们可以明确的得出以下经验:
VAE作为Stable Diffusion 3的组成部分在AI绘画领域持续繁荣,是VAE模型在AIGC时代中最合适的位置。 VAE在AI绘画领域的主要作用,不再是生成能力,而是辅助SD 3等AI绘画大模型的压缩和重建能力。 VAE的编码和解码功能,在以SD 3为核心的AI绘画工作流中有很强的兼容性、灵活性与扩展性,也为Stable Diffusion系列模型增添了几分优雅。
和之前的系列一样,在SD 3中,VAE模型依旧是将像素级图像编码成Latent特征,不过由于SD 3的扩散模型部分全部由Transformer架构组成,所以还需要将Latent特征转换成Patches特征,再送入扩散模型部分进行处理。
之前SD系列中使用的VAE模型是将一个 的图像编码为 的Latent特征,在8倍下采样的同时设置 (通道数),这种情况存在一定的压缩损失,产生的直接影响是对Latent特征重建时容易产生小物体畸变(比如人眼崩溃、文字畸变等)。
所以SD 3模型通过提升 来增强VAE的重建能力,提高重建后的图像质量。下图是SD 3技术报告中对不同 的对比实验:
我们可以看到,当设置 时,VAE模型的整体性能(FID指标降低、Perceptual Similarity指标降低、SSIM指标提升、PSNR指标提升)比 时有较大的提升,所以SD 3确定使用了 (16通道)的VAE模型。
与此同时,随着VAE的通道数增加到16,扩散模型部分(U-Net或者DiT)的通道数也需要跟着修改(修改扩散模型与VAE Encoder衔接的第一层和与VAE Decoder衔接的最后一层的通道数),虽然不会对整体参数量带来大的影响,但是会增加任务整体的训练难度。因为当通道数从4增加到16,SD 3要学习拟合的内容也增加了4倍,我们需要增加整体参数量级来提升模型容量(model capacity)。下图是SD 3论文中模型通道数与模型容量的对比实验结果:
当模型参数量小时,16通道VAE的重建效果并没有比4通道VAE的要更好,当模型参数量逐步增加后,16通道VAE的重建性能优势开始展现出来,当模型的深度(depth)增加到22时,16通道的VAE的性能明显优于4通道的VAE。
不过上图中展示了8通道VAE在FID指标上和16通道VAE也有差不多的效果,Rocky认为在生成领域,只使用一个指标来评价模型整体效果是不够全面的,并且FID只是图像质量的一个间接评价指标,并不能反映图像细节的差异。从重建效果上看,16通道VAE应该有更强的重建性能,而且当模型参数量级增大后,SD 3模型的整体性能上限也大幅提升了,带来了更多潜在的优化空间。
下面是Rocky梳理的Stable Diffusion 3 VAE完整结构图,大家可以感受一下其魅力。希望能让大家对这个在Stable DIffusion系列中持续繁荣的模型有一个更直观的认识,在学习时也更加的得心应手:
【二】介绍一下FLUX.1系列中的VAE模型
FLUX.1系列中,FLUX.1 VAE架构依然继承了SD 3 VAE的8倍下采样和输入通道数(16)。在FLUX.1 VAE输出Latent特征,并在Latent特征输入扩散模型前,还进行了Pack_Latents操作,一下子将Latent特征通道数提高到64(16 -> 64),换句话说,FLUX.1系列的扩散模型部分输入通道数为64,是SD 3的四倍。这也代表FLUX.1要学习拟合的内容比起SD 3也增加了4倍,所以官方大幅增加FLUX.1模型的参数量级来提升模型容量(model capacity)。下面是Pack_Latents操作的详细代码,让大家能够更好的了解其中的含义:
@staticmethod
def _pack_latents(latents, batch_size, num_channels_latents, height, width):
latents = latents.view(batch_size, num_channels_latents, height // 2, 2, width // 2, 2)
latents = latents.permute(0, 2, 4, 1, 3, 5)
latents = latents.reshape(batch_size, (height // 2) * (width // 2), num_channels_latents * 4)
return latents
可以看到FLUX.1模型的Latent特征Patch化方法是将 像素块直接在通道维度上堆叠。这种做法保留了每个像素块的原始分辨率,只是将它们从空间维度移动到了通道维度。与之相对应的,SD 3使用下采样卷积来实现Latent特征Patch化,但这种方式会通过卷积减少空间分辨率从而损失一定的特征信息。
Rocky再举一个形象的例子来解释SD 3和FLUX.1的Patch化方法的不同:
SD 3(下采样卷积):想象我们有一个大蛋糕,SD 3的方法就像用一个方形模具,从蛋糕上切出一个 的小方块。在这个过程中,我们提取了蛋糕的部分信息,但是由于进行了压缩,Patch块的大小变小了,信息会有所丢失。 FLUX.1(通道堆叠):FLUX.1 的方法更像是直接把蛋糕的 块堆叠起来,不进行任何压缩或者切割。我们仍然保留了蛋糕的所有部分,但是它们不再分布在平面上,而是被一层层堆叠起来,像是三明治的层次。这样一来,蛋糕块的大小没有改变,只是它们的空间位置被重新组织了。
总的来说,相比SD 3,FLUX.1将 特征Patch化操作应用于扩散模型之前。这也表明FLUX.1系列模型认可了SD 3做出的贡献,并进行了继承与优化。
目前发布的FLUX.1-dev和FLUX.1-schnell两个版本的VAE结构是完全一致的。同时与SD 3相比,FLUX.1 VAE并不是直接沿用SD 3的VAE,而是基于相同结构进行了重新训练,两者的参数权重是不一样的。并且SD 3和FLUX.1的VAE会对编码后的Latent特征做平移和缩放,而之前的SD系列中VAE仅做缩放:
def encode(self, x: Tensor) -> Tensor:
z = self.reg(self.encoder(x))
z = self.scale_factor * (z - self.shift_factor)
return z
平移和缩放操作能将Latent特征分布的均值和方差归一化到0和1,和扩散过程加的高斯噪声在同一范围内,更加严谨和合理。
下面是Rocky梳理的FLUX.1-dev/schnell系列模型的VAE完整结构图,希望能让大家对这个从SD系列到FLUX.1系列都持续繁荣的模型有一个更直观的认识,在学习时也更加的得心应手:
Rocky认为Stable Diffusion系列和FLUX.1系列中VAE模型的改进历程,为工业界、学术界、竞赛界以及应用界都带来了很多灵感,有很好的借鉴价值。Rocky也相信AI绘画中针对VAE的优化是学术界一个非常重要的论文录用点!
AI视频基础
【一】Sora的扩散模型部分架构是什么样的?
Sora采用Transformer+Diffusion作为核心架构,让其具有好的扩展性能,可以从一个随机噪声开始经过逐步去噪生成视频。
与ViT一样,在使用Transformer架构后,可以将视频数据和图像数据表示为一个patch的集合,每个patch类似于 GPT中的token。通过统一的数据表示方式,可以在比以前更广泛的视觉数据上训练Transformer+Diffusion模型,涵盖不同的持续时间、分辨率和宽高比。
这样一来,Transformer在自然语言处理、图像生成、视频生成、语音合成以及科学计算等领域都实现了大一统。
同时将Transformer与Diffusion的结合能够让生成的视频内容更加惊喜,同时有更多生成可控的空间(比如SDEdit等操作)。
Sora的扩散模型架构大概率参考了 Scalable Diffusion Models with Transformers,这是Sora技术分析中引用的文章,同时Sora透露出的细节和这篇文章也比较吻合。
Sora也验证了scaling law在AI视频领域的有效性,也给全球AI视频领域的从业者一个启发与经验,在不断扩大数据量级和模型规模的基础上,进而探索创新的AI视频模型架构,是AI视频领域持续发展的正确道路。
【二】CogVideoX的扩散模型部分架构是什么样的?
在CogVideoX的3D VAE将视频数据的每一帧编码为一个形状为 的视频潜在向量(Latent Vector)后( 代表帧数, 和 代表每帧图像的高度和宽度, 代表通道数),再将这些视频潜在向量在空间维度上进行补丁化(patching)处理,生成长度为 的序列 。
值得注意,CogVideoX并未在时间维度上进行补丁化处理,这样做的目的是实现图像和视频的联合训练。
同时,CogVideoX的Text Encoder部分将输入的文本Prompt编码层文本嵌入 ,然后将 和 进行Concat拼接,来更好地对齐视觉信息和语义信息。但是这两种信息模态的特征空间可能差异很大,它们的Embeddings可能具有不同的数值尺度。
为了在同一序列中更好地处理它们,CogVideoX设计了Expert Adaptive Layernorm来分别处理每个模态。如下图所示,我们使用扩散过程中的时间步长 作为调制模块的输入。然后,视觉专家自适应层归一化(Vision Expert AdaLN)和文本专家自适应层归一化(Text Expert AdaLN)分别将这种调制机制应用于视觉隐藏状态和文本隐藏状态。这种策略促进了两种模态之间特征空间的对齐,同时尽量减少了额外的参数。
同时在CogVideoX中还引入了旋转位置嵌入(Rotary Position Embedding, RoPE),这是一种相对位置编码技术,已被证明在LLMs中能够有效捕捉词元间关系,尤其擅长处理长序列数据。为了适应视频数据,CogVideoX将RoPE技术扩展为3D-RoPE。视频张量中的每个潜在向量都可以由三维坐标 表示。因此分别将1D-RoPE应用于这些坐标的每个维度,分别占据隐藏状态通道的3/8、3/8和2/8。最终,这些编码沿着通道维度Concat起来,以获得最终的3D-RoPE编码。
在之前的AI视频模型中,通常采用分离的空间注意力机制和时间注意力机制,这样虽然能减少计算复杂性。但是这种注意力分离的方法需要视觉信息的隐式传递,这显著增加了学习的复杂性与难度,并且AI视频模型很难学到大幅度运动物体的一致性。如下图所示,第i帧中的人物的头部无法直接关注到第i+1帧中的人物头部。
为了解决这个问题,CogVideoX设计了一种3D文本-视频混合注意力机制(3D Full Attention)。3D Full Attention充分利用了长上下文训练和FlashAttention技术的优势,实现了高效且精确的多模态数据处理。
下图是Rocky梳理的CogVideoX 3D Expert Transformer的完整结构图,大家可以感受一下其魅力,看着这个完整结构图学习CogVideoX 3D Expert Transformer部分,相信大家脑海中的思路也会更加清晰:
深度学习基础
【一】AI模型训练过程的可视化实用工具有哪些?
在AI模型的训练过程中,使用可视化工具能够帮助我们直观地观察模型的训练效果、调试超参数以及优化模型。以下是一些经典且实用的训练过程可视化工具:
1. TensorBoard
概述:TensorBoard 是 TensorFlow 官方提供的可视化工具,也是目前深度学习中最常用的训练过程可视化工具之一。 功能:支持可视化训练指标(如损失、准确率)、查看计算图、参数分布、梯度变化和激活值等。同时也可以进行超参数调优。 兼容性:支持 TensorFlow、PyTorch(通过 torch.utils.tensorboard
)以及部分其他框架。适用场景:适用于AIGC、传统深度学习、自动驾驶领域AI模型的训练过程分析,尤其适合复杂模型调试。
2. WandB(Weights & Biases)
概述:Weights & Biases 是一个功能强大的实验管理和可视化工具,广泛应用于科研和工业界。 功能:支持实时监控训练过程、记录和可视化指标、超参数调优、数据版本控制以及生成详细报告。此外,WandB 还可以生成详细的训练报告和可视化模型的权重、梯度等。 兼容性:支持多种框架,包括 TensorFlow、Keras、PyTorch、Scikit-Learn 等。 适用场景:适合AIGC、传统深度学习、自动驾驶领域中需要跟踪多个实验、超参数搜索和团队协作的项目。
3. MLflow
概述:MLflow 是一个开源的机器学习实验管理工具,具有模型训练跟踪、项目管理和模型部署等功能。 功能:记录训练过程中的指标和参数变化,支持模型版本控制以及跨设备的协作。可以轻松地记录模型运行的结果、训练曲线和模型权重。 兼容性:支持 PyTorch、TensorFlow、Scikit-Learn 等。 适用场景:适用于AIGC、传统深度学习、自动驾驶领域中希望将可视化和管理结合的场景,尤其是需要进行模型版本控制和跟踪的项目。
4. ClearML
概述:ClearML 是一个开源的端到端机器学习和深度学习实验管理平台。 功能:包括训练监控、任务管理、数据集版本管理和模型部署,提供实时指标可视化、训练曲线、超参数调优支持。 兼容性:支持 TensorFlow、PyTorch、Keras 等多种主流深度学习框架。 适用场景:ClearML 非常适合AIGC、传统深度学习、自动驾驶领域中需要完整的实验跟踪、管理和可视化解决方案的用户。
5. VisualDL
概述:VisualDL 是百度飞桨(PaddlePaddle)提供的可视化工具,功能与 TensorBoard 类似。 功能:支持监控训练指标、展示计算图、参数分布、PR 曲线等。还支持高维数据可视化和超参数调优。 兼容性:虽然与 PaddlePaddle 完全兼容,也支持 PyTorch 和 TensorFlow。 适用场景:适用于AIGC、传统深度学习、自动驾驶领域中国内开发者,特别是使用飞桨框架的用户。
6. Comet
概述:Comet 是一个实验管理和可视化工具,提供了多种模型和实验跟踪功能。 功能:支持实时查看训练指标、超参数调优、生成训练曲线、版本管理和协作。还提供模型的可视化及对比功能。 兼容性:支持 TensorFlow、Keras、PyTorch、Scikit-Learn 等。 适用场景:适合AIGC、传统深度学习、自动驾驶领域中需要强大可视化功能和团队协作的实验项目。
7. Neptune.ai
概述:Neptune 是一个面向机器学习和深度学习的可视化跟踪平台。 功能:支持实时训练过程监控、记录模型参数和指标、超参数调优以及结果共享。Neptune 的最大特色是其与 Jupyter Notebook 深度集成,便于快速调试。 兼容性:支持 TensorFlow、PyTorch、Keras 等多个框架。 适用场景:适合AIGC、传统深度学习、自动驾驶领域中需要精细化实验管理、跨团队协作和快速调试的用户。
8. Plotly/Dash
概述:Plotly 和 Dash 是用于数据科学和深度学习的强大可视化库,可以实现自定义的实时数据可视化界面。 功能:支持创建交互式训练过程图表和统计图,可以结合模型的实时状态做出复杂可视化界面。 兼容性:与多种框架兼容,但需要手动集成。 适用场景:适合AIGC、传统深度学习、自动驾驶领域中需要高度自定义的可视化、交互式展示的场景。
9. Netron
概述:Netron 是一个开源的神经网络模型可视化工具,支持查看模型结构。 功能:支持多种深度学习框架和格式的模型可视化,如 TensorFlow、Keras、PyTorch、ONNX 等,主要用于查看模型的各层结构。 兼容性:支持多种模型文件格式,包括 ONNX、H5、PB、TFLite 等。 适用场景:适合AIGC、传统深度学习、自动驾驶领域中查看模型结构、理解模型架构和调试模型。
【二】介绍一下schedule_free优化器的原理
Schedule-Free技术是一种在深度学习模型训练过程中,通过省去预设的学习率调度(schedule)来进行优化的技术。这种方法旨在通过简化超参数调优过程,提升训练的效率和适应性。Schedule-Free技术的原理在于使用自适应调整和动态优化策略,使得模型在训练过程中不再依赖预设的学习率变化曲线,而是通过其他策略来实现稳定收敛。
Schedule-Free的核心原理
在传统的优化算法中,比如随机梯度下降(SGD)或Adam,学习率调度是训练过程中的一个重要部分。通常,我们会使用余弦衰减、阶梯衰减或指数衰减等策略,按一定规则动态调整学习率,以确保模型在训练的不同阶段有不同的学习率,这有助于模型在开始时快速收敛,在后期更稳定地微调。然而,这种调度策略需要设定特定的超参数和函数形式,且不同任务可能需要不同的学习率调整曲线。
Schedule-Free优化则放弃了传统的学习率调度,而是通过以下几种策略来实现类似的效果:
自适应学习率调整
Schedule-Free技术通过自适应地调整学习率,而非预设一个固定的学习率变化曲线。这可以借助一些自适应优化算法(例如AdaGrad、RMSprop、Adam等)来实现,它们通过对梯度的变化进行分析,动态调整每一轮的学习率。这样,学习率可以随训练过程自动变化,以适应损失函数的不同阶段。插值更新
Schedule-Free技术通过引入插值计算来调整每一轮参数更新的幅度。在每次更新中,会将上一次的参数和当前的梯度信息结合起来,通过插值来生成一个新的更新点,这样模型在每一轮中都能自动找到一个更平滑的更新方向,减少学习率的依赖。这种插值的方式通常会减缓更新的步伐,使得模型逐渐收敛。 在每次迭代中,首先计算一个插值点 ,其公式为:其中, 是主要的迭代点, 是用于测试或验证损失计算的点, 是插值系数,通常取值在0到1之间。平均参数更新
Schedule-Free方法引入了类似动量更新的概念,即使用历史更新的平均值来平滑参数更新。在每次迭代时,将前几次迭代的更新平均化,使得当前的更新不至于过大或过小,这种平滑处理也在一定程度上减小了对学习率的依赖。具体来说,模型每一步的更新都基于前一步的参数和本轮的梯度值的某种加权平均,这种平均可以帮助模型平滑地收敛。 使用插值点 计算梯度,并更新主要迭代点 :其中, 是学习率, 是在 处计算的损失函数的梯度。 更新用于测试或验证的点 ,其公式为:该步骤相当于对 进行加权平均,使 平滑地跟随 的变化。梯度控制
在Schedule-Free技术中,还引入了一些基于梯度大小的控制机制。比如,如果某一轮的梯度变化过大,可能会引起收敛不稳定,因此可以将这轮的梯度调整为某个固定值,避免对模型造成过大的影响。这样在每一轮中,模型都能保持稳定的收敛速度,减少训练后期对学习率调度的依赖。
Schedule-Free的优势与特点
减少超参数调优成本
传统的学习率调度需要设置和调整多个参数,如初始学习率、衰减步数、衰减幅度等。Schedule-Free技术自动调节学习率,使得这些超参数调优的工作量大大减少,适合快速实验和需要灵活配置的项目。提升训练稳定性
Schedule-Free方法通过插值、平均更新等策略,平滑了参数更新过程,避免了因学习率变化过快带来的不稳定。这尤其适合复杂模型和大规模数据集,能更快、更稳定地实现收敛。适应性强
Schedule-Free技术对不同的数据集和任务具有较强的适应性。由于其不依赖特定的学习率调度曲线,所以在迁移到新任务或数据集时,无需重新设定学习率策略。这在迁移学习或多任务学习中尤为有用。更符合分布式训练需求
在分布式深度学习中,Schedule-Free的自适应特性允许模型在不同节点上自由调整学习率,而不需要同步全局的学习率变化,这简化了分布式训练的协调过程。
Schedule-Free技术的应用场景
Schedule-Free技术特别适合以下场景:
长时间训练:在需要长时间训练的深度学习任务中,Schedule-Free技术可以稳定、自动地调整学习率,不需要在训练后期手动设置新的学习率曲线。 快速实验:对于实验频繁变化、参数需要快速调整的任务,Schedule-Free可以简化模型的调试和参数设置过程,加快模型迭代速度。 迁移学习和微调:在一些迁移学习和微调任务中,原始模型可能不适用固定的学习率变化,Schedule-Free可以帮助模型在新的数据集或任务中快速适应。 多分辨率生成模型:在生成模型(如AIGC)中,生成不同分辨率的图像可能对学习率有不同需求,Schedule-Free可以灵活调整学习率,适应不同分辨率的生成需求。
机器学习基础
【一】介绍一下机器学习中的MSE损失函数
在机器学习中,均方误差(MSE,Mean Squared Error)损失函数是回归任务中最常用的一种损失函数,用于衡量模型预测值和实际值之间的差距。MSE 损失函数通过计算预测值与真实值之差的平方来度量模型的误差,其值越小,说明模型的预测结果越接近真实值。
MSE损失函数的定义
给定数据集 (其中 , 是输入值, 是实际值),模型的预测值为 ,均方误差损失函数定义为:
:第 个样本的实际值。 :模型对第 个样本的预测值。 :样本的总数。
MSE的计算过程
计算误差:对每一个样本计算误差,即实际值 和预测值 之差,得到误差项 。 平方误差:对每个样本的误差取平方,这样可以消除误差的正负性,使得误差的方向不影响损失的计算。 求均值:将所有样本的平方误差求和,然后取平均,即得到均方误差。
MSE的取值为非负数,越接近 0 表示模型预测值和真实值越接近。
MSE的性质
凸性:MSE 是一个凸函数,在优化过程中容易找到全局最小值。因此,梯度下降等优化算法可以较为高效地找到损失函数的极小值。
平滑性:MSE 函数是连续且可微的,在大多数优化算法中可以方便地计算梯度。
对异常值敏感:MSE 对异常值(outliers)非常敏感,因为误差取平方后会放大异常值的影响。这意味着即使只有一个预测值与真实值相差很大,MSE 的值也会明显增大。
MSE的导数
MSE的导数是梯度下降算法计算权重更新量时需要的。对参数 求导后得到的梯度公式为:
在每次梯度下降的迭代中,模型的参数会根据这个梯度值调整,从而逐步减小 MSE 损失。
优势与劣势
优势
易于计算和优化:MSE 的计算非常简单,对每个样本的误差平方取均值,可以高效实现。 数学性质好:凸性和平滑性使得在参数优化时容易找到最优解,适合使用梯度下降法来优化模型。
劣势
对异常值敏感:如果数据集中存在异常值,MSE 会受到较大影响。异常值的平方误差可能非常大,导致模型过度拟合这些异常值。 解释性不如MAE:由于 MSE 是平方误差的均值,其单位与原始数据不一致(平方),因此在解释上不如 平均绝对误差(MAE) 直观。
【二】如何在AI模型中加入先验知识?
在AI模型中加入先验知识可以帮助模型更快收敛、减少数据需求、增强模型的泛化能力。先验知识是一种基于已知的经验、规则或领域知识,可以作为模型的指导原则。以下是几种常用的方法来将先验知识融入AI模型中:
1. 通过特征工程引入先验知识
在训练模型之前,特征工程是一个重要步骤,通过提取、转换和组合数据特征,能够将有用的先验知识注入模型。具体方法包括:
构造新特征:根据领域知识提取相关特征。例如,在气象预测中可以利用“湿度”和“温度”的组合特征,而在金融领域,可以构造基于历史价格变化的移动平均值。
特征选择:从已有的特征中筛选出更重要的特征,减少无用或冗余信息的干扰,从而使模型更加专注于重要信息。
特征编码:对于分类特征,可以使用标签编码、独热编码等方法,将领域知识中的分类信息转换为模型可以理解的形式。例如,在医学数据中,将“严重程度”级别转换为数值型编码。
2. 设计损失函数来反映先验知识
损失函数是模型优化的核心,通过修改损失函数可以将先验知识整合到模型的学习目标中。具体方法包括:
加权损失:为特定的样本或特征添加权重,以突出具有重要意义的部分。例如,在疾病预测中,对更严重的病例赋予更大的权重,使得模型更加重视这些样本。
正则化项:加入正则化项,以鼓励模型学习符合先验知识的解。例如,L2 正则化可以防止模型参数过大,避免过拟合。
特定目标的损失函数:设计特定损失函数来反映业务需求或领域知识。例如,在排序任务中,可以加入排名损失,以保证预测结果符合期望的排序关系。
3. 通过规则嵌入模型来引入先验知识
在模型中直接嵌入领域规则可以帮助模型对特定条件或场景有更明确的反应:
约束优化:在模型优化过程中引入约束条件,使模型满足特定要求。例如,在路径规划中,可以为模型设置必须避开特定区域的约束条件。
决策规则:将基于经验的规则或公式作为辅助信息加入模型中。例如,在信用评分模型中,加入“高负债率降低信用评分”的规则,使模型能够根据具体条件作出合理的决策。
知识图谱:将知识图谱整合到模型中,使模型能够利用结构化的关系信息来推理或生成内容。知识图谱包含大量实体、关系和属性,可以帮助模型更好地理解复杂的语义。
4. 利用预训练模型和迁移学习引入先验知识
使用预训练模型和迁移学习是一种有效的方式,可以从外部数据或相关任务中获取先验知识:
预训练模型:利用在大规模数据集(如ImageNet、GPT-3)上训练的模型,进行微调以适应特定任务。预训练模型已经学习了丰富的特征,包含广泛的知识,可直接应用于新的任务中。
迁移学习:将先验知识从一个任务迁移到另一个任务。例如,在情感分析中使用预训练的语言模型,然后在新的领域数据上微调,这样可以加快收敛速度,减少对大量数据的需求。
多任务学习:通过在多个相关任务上同时训练模型,使得模型能够学习到各个任务之间的共性知识。多任务学习可以帮助模型在多个任务上共享先验知识,增强泛化能力。
5. 通过数据增强加入先验知识
数据增强技术可以在训练数据中加入先验知识,帮助模型更好地学习特定的特征或模式:
数据合成:基于领域知识生成新样本。例如,在医学影像中,利用原有影像数据生成新的病变图像,以增加模型对不同病变类型的识别能力。
不变性数据增强:在图像或语音识别中,通过旋转、缩放、翻转等操作增强数据,注入数据的几何先验知识,使模型能够学习到特征的不变性。
生成对抗网络(GAN):利用GAN生成与实际数据相似的样本,以增强模型的鲁棒性。GAN的生成结果可以为模型提供多样化的先验知识,尤其适合在数据匮乏的场景中使用。
6. 使用启发式学习和专家标注
启发式学习和专家标注是结合人类知识和经验的方式,能够直接影响模型的训练过程:
标签生成:根据先验知识和专家经验标注样本,特别是在监督学习中,可以通过引入专家标签提升数据质量。
启发式规则生成标签:例如在文本分类中,利用关键字匹配、模式识别等方法,生成初始标签,帮助模型快速学习。
教师网络与知识蒸馏:通过训练教师网络,将其作为知识来源,指导学生网络的训练。在教师网络中可以引入大量先验知识,通过知识蒸馏的方式使学生网络在不增加复杂度的情况下学习到更丰富的知识。
7. 通过贝叶斯学习和概率模型引入先验知识
贝叶斯学习和概率模型可以利用先验概率进行推断,使模型能够结合数据和先验知识共同决策:
贝叶斯先验:在贝叶斯推理中,先验知识可以作为先验概率加入模型。根据先验知识和数据的观测结果,更新后验概率,使模型更合理地输出预测。
隐变量模型:在主题建模等任务中,可以利用隐变量表示先验知识。例如在LDA主题模型中,可以将特定主题设定为先验,使模型在训练过程中向这些主题倾斜。
总结
在AI模型中引入先验知识的方法多种多样,具体选择应基于任务需求、数据特性和先验知识的可获得性。通过特征工程、定制损失函数、直接嵌入规则、迁移学习、数据增强、专家标注和贝叶斯方法等途径,先验知识可以有效指导模型的训练,使模型在数据量有限或场景复杂时依然表现良好。
Python编程基础
【一】介绍一下Python的自省特性
Python 的自省(Introspection)特性指的是程序在运行时动态检查和获取自身对象信息的能力。借助自省特性,Python 程序可以在执行过程中了解对象的类型、属性、方法以及内存位置等信息,这对于调试、动态操作、元编程等场景非常有用。
自省的主要用途
动态获取对象类型
x = 10
print(type(x)) # <class 'int'>
print(isinstance(x, int)) # True
使用 type()
函数获取对象的类型。使用 isinstance()
判断对象是否属于某种类型。
检查对象的属性和方法
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, {self.name}")
p = Person("Alice")
print(dir(p)) # 输出 p 对象的属性和方法列表
dir()
函数用于列出对象的所有属性和方法。
获取对象的属性值
print(getattr(p, "name")) # 获取属性 'name' 的值
setattr(p, "age", 25) # 动态设置一个新的属性 'age'
print(hasattr(p, "age")) # 检查是否有属性 'age'
使用 getattr()
、setattr()
和hasattr()
动态获取、设置和检查对象属性的值。
函数与可调用对象检查
print(callable(p.greet)) # True, 因为 greet 是可调用的
callable()
用于检查对象是否是可调用的(如函数、类实例等)。
模块与类的自省
print(p.__class__) # 输出 <class '__main__.Person'>
print(p.__dict__) # 输出 {'name': 'Alice', 'age': 25}
使用 __name__
获取模块名,__class__
获取对象的类。__dict__
列出对象的所有属性和方法。
内置库 inspect
import inspect
def my_function(x):
return x + 1
print(inspect.getmembers(my_function)) # 列出函数的所有成员
print(inspect.signature(my_function)) # 获取函数签名
inspect
模块提供了更强大的自省功能,如获取函数签名、源代码、调用层次等信息。
自省的应用场景
调试与日志记录:可以在运行时动态检查对象的类型和属性值,有助于快速调试和生成详细的日志。 元编程:在 Python 中使用装饰器、动态类等元编程技巧时,自省特性提供了关键支持。 自动化测试:通过自省可以检查测试对象的结构、属性和方法,帮助自动生成和执行测试用例。 动态操作:在框架设计中,如序列化/反序列化,依赖自省来动态获取对象信息和自动处理数据。
【二】python中RGBA图像和灰度图如何相互转化?
将RGBA图像转换为灰度图
在 Python 中,可以使用 NumPy
或 Pillow
库将图像从 RGBA 转换为灰度图。以下是几种常用的方法:
方法 1:使用 Pillow 库
Pillow 是一个常用的图像处理库,提供了简单的转换功能。
from PIL import Image
# 打开 RGBA 图像
image = Image.open("image.png")
# 将图像转换为灰度
gray_image = image.convert("L")
# 保存灰度图
gray_image.save("gray_image.png")
在这里,convert("L")
会将图像转换为灰度模式。Pillow 会自动忽略透明度通道(A 通道),只保留 RGB 通道的灰度信息。
方法 2:使用 NumPy 手动转换
如果想要自定义灰度转换过程,可以使用 NumPy
自行计算灰度值。通常,灰度图的像素值由 RGB 通道加权求和得到:
import numpy as np
from PIL import Image
# 打开 RGBA 图像并转换为 NumPy 数组
image = Image.open("image.png")
rgba_array = np.array(image)
# 使用加权平均公式转换为灰度
gray_array = 0.2989 * rgba_array[:, :, 0] + 0.5870 * rgba_array[:, :, 1] + 0.1140 * rgba_array[:, :, 2]
# 将灰度数组转换为 PIL 图像
gray_image = Image.fromarray(gray_array.astype(np.uint8), mode="L")
# 保存灰度图
gray_image.save("gray_image.png")
这里的加权值 [0.2989, 0.5870, 0.1140]
是标准的灰度转换系数,可以根据需求调整。
方法 3:使用 OpenCV
OpenCV 是一个功能强大的计算机视觉库,也提供了从 RGBA 转换为灰度图的方法:
import cv2
# 读取图像
rgba_image = cv2.imread("image.png", cv2.IMREAD_UNCHANGED)
# 转换为 RGB 图像
rgb_image = cv2.cvtColor(rgba_image, cv2.COLOR_RGBA2RGB)
# 转换为灰度图
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
# 保存灰度图
cv2.imwrite("gray_image.png", gray_image)
在 OpenCV 中,我们需要先将图像从 RGBA 转换为 RGB,然后再转换为灰度图,因为 OpenCV 的 COLOR_RGBA2GRAY
转换模式在一些版本中并不支持直接转换。
将灰度图转换为RGBA图像
将灰度图转换为 RGBA 图像可以通过添加颜色通道和透明度通道来实现。可以使用 Pillow
或 NumPy
来完成这个任务。以下是几种方法:
方法 1:使用 Pillow 将灰度图转换为 RGBA
Pillow 可以方便地将灰度图转换为 RGB 或 RGBA 图像。
from PIL import Image
# 打开灰度图像
gray_image = Image.open("gray_image.png").convert("L")
# 转换为 RGBA 图像
rgba_image = gray_image.convert("RGBA")
# 保存 RGBA 图像
rgba_image.save("rgba_image.png")
在这里,convert("RGBA")
会将灰度图像转换为 RGBA 图像,其中 R、G、B 通道的值与灰度值相同,而 A 通道的值为 255(不透明)。
方法 2:使用 NumPy 将灰度图转换为 RGBA
如果需要更灵活的操作,可以使用 NumPy
来手动添加透明度通道。
import numpy as np
from PIL import Image
# 打开灰度图像并转换为 NumPy 数组
gray_image = Image.open("gray_image.png").convert("L")
gray_array = np.array(gray_image)
# 创建 RGBA 图像数组,R、G、B 都取灰度值,A 通道设置为 255
rgba_array = np.stack((gray_array,)*3 + (np.full_like(gray_array, 255),), axis=-1)
# 将数组转换为 RGBA 图像
rgba_image = Image.fromarray(rgba_array, mode="RGBA")
# 保存 RGBA 图像
rgba_image.save("rgba_image.png")
在这段代码中:
np.stack((gray_array,)*3 + (np.full_like(gray_array, 255),), axis=-1)
将灰度值复制到 R、G、B 通道,并添加一个全为 255 的 A 通道,表示完全不透明的像素。
方法 3:使用 OpenCV 将灰度图转换为 RGBA
OpenCV 也可以用于此操作,但需要一些转换步骤,因为 OpenCV 默认不支持直接的 RGBA 模式。可以使用 NumPy
添加 A 通道,再将结果转换为 OpenCV 图像。
import cv2
import numpy as np
# 读取灰度图像
gray_image = cv2.imread("gray_image.png", cv2.IMREAD_GRAYSCALE)
# 将灰度图像扩展为 3 个通道(RGB)
rgb_image = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2RGB)
# 添加 A 通道,设置为 255(完全不透明)
rgba_image = cv2.merge((rgb_image, np.full_like(gray_image, 255)))
# 保存 RGBA 图像
cv2.imwrite("rgba_image.png", rgba_image)
在这段代码中:
cv2.COLOR_GRAY2RGB
将灰度图像转换为 3 通道 RGB 图像。cv2.merge
添加一个 A 通道,并设置为 255 表示完全不透明。
模型部署基础
【一】有哪些常见的AI模型分布式训练方式?
在AI行业中,不管是AIGC、传统深度学习还是自动驾驶领域,分布式训练都是非常有价值的一种将模型训练任务分配到多个计算节点上,以加速训练过程的方法。分布式训练的主要方式包括 数据并行(Data Parallelism)、模型并行(Model Parallelism)、混合并行(Hybrid Parallelism) 和 流水线并行(Pipeline Parallelism) 等。
1. 数据并行(Data Parallelism)
数据并行 是分布式训练中最常用的方法。数据并行的核心思想是将训练数据分成多个部分,分别交给多个计算设备(如 GPU)进行训练。每个设备独立计算梯度,最后在所有设备之间汇总梯度并更新模型参数。
工作流程
数据划分:训练数据被划分成若干批次,每个设备(如 GPU)负责一个数据子集。 并行计算:每个设备使用相同的模型副本对其分配的数据进行前向和后向传播,独立计算梯度。 梯度汇总与更新:每轮训练后,所有设备上的梯度通过同步或异步方式汇总,并将平均后的梯度应用于全局模型参数的更新。
优点
高效:适合具有大量数据的任务,可以充分利用硬件资源。 易实现:大多数深度学习框架(如 TensorFlow、PyTorch)都提供了数据并行的自动支持。
缺点
通信开销:在每次更新模型参数时,设备间需要交换梯度信息,导致通信开销较大,尤其是在多个设备间传输数据时。 GPU显存限制:模型副本需要在每个设备上加载一份,如果模型非常大,会占用大量显存资源。
2. 模型并行(Model Parallelism)
模型并行 的核心思想是将模型切分成多个部分,并将这些部分分布在不同设备上训练。模型并行适合处理那些单个 GPU 显存不足以容纳的超大模型。
工作流程
模型切分:将模型分割成不同的模块或层次,比如将前一部分放在一个设备上,后一部分放在另一个设备上。 逐层处理:每个设备只负责计算其所分配的模型部分的前向和后向传播。前向传播的输出会被传递到下一个设备。 梯度计算:在反向传播时,梯度从模型的最后一层往前传播,各设备负责其分配到的模型层梯度计算。
优点
适合超大模型:对于无法在单个设备上加载的模型,可以通过模型分割跨多个设备。 减少内存开销:每个设备仅需存储模型的一个部分,内存占用更少。
缺点
同步开销:设备之间需要频繁交换前向和后向传播的中间结果,这增加了通信成本。 较难实现:需要根据模型结构手动切分,且同步管理复杂。
3. 混合并行(Hybrid Parallelism)
混合并行 结合了数据并行和模型并行的优点,适合超大规模模型或特别复杂的模型训练。
工作流程
模型切分:先通过模型并行将模型切分成不同的模块,分配到多个设备上。 数据并行:然后在每个模型部分上再应用数据并行,每个设备处理不同的数据批次。 同步与更新:每个模型部分的计算结果进行汇总,汇总后再更新模型参数。
优点
适合超大模型和数据集:可以处理数据量和模型参数量都很大的任务。 最大化资源利用率:同时利用数据并行的效率和模型并行的内存优势。
缺点
复杂性:混合并行的实现难度较高,特别是需要在数据并行和模型并行之间合理协调。 通信开销较大:通信需求复杂,可能导致延迟。
4. 流水线并行(Pipeline Parallelism)
流水线并行 是一种将模型的不同部分分配到不同设备上并分阶段执行的策略。流水线并行通常结合模型并行,将模型按层或模块切分为不同的“段”,并依次执行不同阶段的前向和后向传播。
工作流程
模型分段:将模型按顺序分成不同的段(如多个层或模块),每个段放在不同的设备上。 流水执行:每个设备按照流水线的方式接收上一个设备的输出并进行前向计算,完成计算后传给下一个设备。 梯度回传:在反向传播时同样分段依次回传梯度,直到最初的设备。
优点
适合超大模型:流水线分段可降低单设备的计算压力。 高效利用计算资源:可减少设备的空闲时间,实现更高效的训练。
缺点
复杂性:模型切分和流水线管理较为复杂。 延迟:由于模型切分和数据依次传递,可能导致训练延迟,尤其是批处理数据较小时效果不佳。
5. 参数服务器(Parameter Server)架构
参数服务器架构 是一种较为传统的分布式训练架构,通常与数据并行结合使用。参数服务器在分布式系统中充当中央节点,负责存储和更新模型参数,而其他计算节点(工作节点)进行前向和后向传播,并在训练中定期与参数服务器同步参数。
工作流程
参数存储:模型参数存储在参数服务器中,各计算节点从参数服务器获取参数。 梯度更新:每个计算节点计算本地梯度,将结果发送到参数服务器。 参数同步:参数服务器将接收的梯度进行平均或聚合后,更新模型参数并广播给各计算节点。
优点
灵活性:参数服务器架构便于扩展,适合大规模分布式训练。 支持异步更新:可以实现参数异步更新,减少同步时间,提高吞吐量。
缺点
服务器压力大:参数服务器需要承载大量数据同步,容易成为性能瓶颈。 参数一致性问题:异步更新可能导致不同计算节点参数不一致,影响模型的收敛。
6. 异步分布式训练(Asynchronous Distributed Training)
在异步分布式训练中,各节点不必等待其他节点完成训练,而是独立进行计算并更新参数。这种方法通常与参数服务器结合使用,减少同步等待时间,提高计算效率。
工作流程
独立训练:各计算节点独立执行前向和后向传播,不等待其他节点完成。 异步更新:各节点在完成训练后,将其梯度发送到参数服务器,服务器根据不同节点传回的梯度异步更新参数。
优点
高效:不需要同步等待,可以提高训练速度。 适合异构环境:适合计算能力不同的设备。
缺点
不一致性:异步更新容易造成参数不一致,可能导致收敛变慢或不稳定。
【二】有哪些常见的AI模型分布式推理方式?
在AI行业中,不管是AIGC、传统深度学习还是自动驾驶领域,都可以进行分布式推理,将模型的推理过程分散到多个计算节点,以满足对处理速度、吞吐量和资源使用效率的需求。
1. 数据并行推理(Data Parallel Inference)
数据并行推理 是一种将输入数据分批分配到不同的设备上,每个设备独立加载模型并对其分配的数据进行推理的方式。这种方法在批量推理中非常高效,可以显著提高吞吐量。
工作流程
数据分批:将推理数据划分成若干批次,每个设备处理一个数据子集。 独立推理:每个设备都加载完整的模型,并对其分配的数据子集进行推理。 结果汇总:所有设备完成推理后,将结果汇总为完整的输出。
优点
高吞吐量:可以同时处理多个输入数据,适合批量推理。 易实现:每个设备加载相同的模型副本,不需要复杂的模型切分。
缺点
资源重复:每个设备都需要加载整个模型,会占用更多内存资源,尤其对于大型模型。 通信开销:在多机推理时,设备之间的结果汇总会带来一定的通信延迟。
2. 模型并行推理(Model Parallel Inference)
模型并行推理 适用于单个设备内存不足以加载整个模型的情况。通过将模型切分成多个部分,分布到多个设备上,推理时各设备协同工作完成推理任务。
工作流程
模型切分:将模型按层或模块划分到不同的设备上,每个设备负责模型的一部分。 逐层推理:输入数据通过各设备依次进行前向传播,逐层完成推理。 结果收集:最后一部分的设备得到最终输出结果。
优点
适合超大模型:可以处理单个设备无法容纳的大模型,适合复杂的深度学习模型。 减少内存使用:每个设备只需存储模型的一部分,降低了单个设备的内存负担。
缺点
同步延迟:设备之间需要频繁传递中间结果,导致通信开销。 实现复杂:需要根据模型结构手动划分和同步,管理复杂。
3. 混合并行推理(Hybrid Parallel Inference)
混合并行推理 是结合数据并行和模型并行的方式,以处理既有大数据量输入、又需要大模型计算的推理任务。通常用于超大规模推理任务。
工作流程
模型划分:使用模型并行将模型分成不同的部分,分布到多个设备上。 数据并行:然后在模型每个部分上应用数据并行,以便不同设备可以处理数据批次。 结果同步:设备之间通过数据并行和模型并行组合计算出结果,并汇总所有设备输出。
优点
高扩展性:适合大规模数据和大模型的场景,结合了数据和模型并行的优点。 资源利用率高:同时利用了数据并行的吞吐量和模型并行的内存节省。
缺点
实现难度高:需要管理数据和模型的多重并行,结构较为复杂。 通信开销大:由于需要设备之间的多次同步和中间结果传递,延迟较高。
4. 流水线并行推理(Pipeline Parallel Inference)
流水线并行推理 是一种将模型切分为多个阶段,按流水线方式依次处理输入数据的推理方法,适合长时间推理任务或层级非常深的模型(如 Transformer)。
工作流程
模型分段:将模型按层分成多个阶段,每个阶段放在不同的设备上。 分段推理:输入数据从第一阶段开始依次通过每个阶段的推理过程,最终得到输出结果。 批量处理:不同输入数据可以依次进入流水线,使每个设备持续工作,减少等待时间。
优点
适合长推理任务:对于层级较深的模型,流水线并行可以显著减少推理延迟。 高效利用资源:各设备不断处理输入数据,空闲时间少,资源利用率高。
缺点
同步延迟:流水线方式在层与层之间需要同步传递数据,批量较小时效果有限。 管理复杂:需要精细设计流水线结构,确保各设备处理时间接近,避免瓶颈。
5. 异构推理(Heterogeneous Inference)
异构推理 是利用不同种类的计算资源(如 CPU、GPU、TPU 等)同时执行模型的不同部分或任务。异构推理可最大化利用不同硬件的特点。
工作流程
任务划分:根据计算任务的特点,将模型的不同部分分配给合适的计算资源。例如,将计算密集的部分放在 GPU 上,逻辑控制部分放在 CPU 上。 并行执行:各计算资源并行执行其分配的任务,并通过通信同步数据。 结果汇总:最终汇总各设备的计算结果,得到完整推理输出。
优点
硬件高效利用:充分发挥不同设备的特点,提高整体推理速度。 灵活性高:可以根据任务的不同特点优化资源分配,提高效率。
缺点
通信开销:不同硬件设备之间的通信延迟较高。 实现复杂性:需要考虑不同硬件设备的特性,分配和同步复杂。
6. 参数服务器推理(Parameter Server Inference)
参数服务器推理 模式适用于需要共享和同步模型参数的场景,尤其在分布式推理系统中较为常用。参数服务器充当中央节点,存储和管理模型参数,多个计算节点同时使用这些参数进行推理。
工作流程
参数存储:模型参数存储在参数服务器上,各计算节点从参数服务器获取参数。 分布式推理:计算节点独立执行推理任务,使用参数服务器提供的共享参数。 结果汇总:各节点计算完成后,将结果返回并汇总,获得完整推理结果。
优点
高效共享参数:对于共享参数的推理任务,参数服务器提供了一个高效的解决方案。 适合大规模推理:支持多个计算节点并行推理,适合大规模推理任务。
缺点
通信瓶颈:参数服务器需要处理多个计算节点的同步请求,可能成为性能瓶颈。 实现复杂性:需要协调各计算节点与参数服务器之间的同步和通信。
计算机基础
Rocky从工业界、学术界、竞赛界以及应用界角度出发,总结归纳AI行业所需的计算机基础干货知识。这些干货知识不仅能在面试中帮助我们,还能让我们在AI行业中提高工作效率。
【一】介绍一下CPU核数与程序进程数设置之间的关系
在计算机系统中,CPU核数与程序进程数的关系决定了系统资源的利用效率和程序的执行性能。在AI行业中,理解这一关系有助于我们合理设计和优化并发的AI程序,提升性能。
1. CPU核数
物理核数:指实际存在的物理核心数量,通常由处理器芯片的硬件结构决定。 逻辑核数:如果处理器支持超线程技术(如 Intel 的 Hyper-Threading),则每个物理核心可以执行两个逻辑线程,这样的处理器可以拥有双倍的逻辑核数。
例如:一颗 4 核 8 线程的 CPU,有 4 个物理核心和 8 个逻辑核心。
2. 程序进程数
程序的进程数可以决定程序执行的并行度。在并发编程中,进程数量的设置会影响程序的性能。进程是独立的运行单元,而线程共享进程的资源,因此在 CPU 核数的基础上决定了程序运行时资源的分配情况。
3. CPU核数与进程数的关系
单核单进程:在单核 CPU 上,无法实现真正的并行,多个进程只能在单核上轮流执行,即使用时间片的方式分时运行。因此,运行多个进程不会增加计算效率,反而会增加上下文切换的开销。
多核多进程:在多核 CPU 上,可以同时运行多个进程,这样可以真正实现并行执行。例如,4 核 CPU 可以同时运行 4 个进程,从而显著提升并行计算性能。
进程数小于或等于逻辑核数:一般情况下,进程数设置为等于或略少于逻辑核数可以实现较高的 CPU 利用率。这样可以保证每个进程都有独立的执行核心,从而减少上下文切换,提高程序执行效率。
进程数大于逻辑核数:当进程数超过逻辑核数时,CPU 必须通过时间片轮换来调度多个进程。这会引入一定的上下文切换开销,导致 CPU 效率下降。对于 I/O 密集型任务,适当增加进程数可以掩盖 I/O 等待时间,提高吞吐量;但对于 CPU 密集型任务,超过逻辑核数的进程数通常会降低性能。
4. I/O密集型与CPU密集型程序的优化
I/O 密集型任务:这类任务的瓶颈通常在于等待 I/O 操作(如文件读写、网络请求等),CPU 利用率相对较低。在 I/O 等待期间,CPU 是空闲的,因此可以增加更多进程(通常大于逻辑核数),以便更好地利用 CPU。
CPU 密集型任务:这类任务需要大量计算,CPU 占用率较高。对于 CPU 密集型程序,建议进程数不超过物理核数或逻辑核数,这样每个核心可以专注于计算,减少上下文切换,提升效率。
5. 进程数的设置策略
CPU 密集型任务:进程数 = 物理核心数,或略高于物理核心数。 I/O 密集型任务:进程数 > 逻辑核心数,但不宜过多,通常设置为逻辑核心数的 2~3 倍效果较好。
不同任务类型有不同的优化策略,通过合理设置进程数,可以达到最佳的 CPU 利用率和程序性能。
【二】介绍一下CPU核数与程序线程数设置之间的关系
在AI行业的并行计算和多线程编程中,CPU核数与程序线程数的关系非常重要。合理的线程数设置可以充分利用 CPU 资源,提升程序性能。
1. CPU核数
物理核数:实际的物理核心数量,是由硬件决定的,通常是程序执行的并行度上限。 逻辑核数:如果 CPU 支持超线程技术,每个物理核心可以运行两个逻辑线程,从而提升并发能力。逻辑核数通常是物理核数的两倍。
例如,一颗 4 核 8 线程的 CPU 具有 4 个物理核心和 8 个逻辑核心。
2. 程序线程数
线程是进程中的执行单元,不同线程可以共享同一进程的内存空间。设置合理的线程数可以影响程序的执行效率。通常来说,线程数与 CPU 的核心数量和任务性质密切相关。
3. CPU核数与线程数的关系
线程数小于或等于逻辑核数:当线程数等于或略少于逻辑核数时,可以有效利用 CPU 资源。每个线程可以在独立的核心上运行,减少上下文切换开销,实现较高的 CPU 利用率。
线程数大于逻辑核数:当线程数超过逻辑核数时,多个线程需要在同一个核心上轮流执行。虽然可以提升并行度,但会增加上下文切换的开销,可能导致性能下降。特别是在 CPU 密集型任务中,过多的线程数反而会降低效率。
4. 线程数设置与任务类型
程序的线程数应根据任务类型来设置,不同任务对线程数的要求不同:
I/O 密集型任务
特点:I/O 密集型任务的瓶颈主要在于等待 I/O 操作(如文件读写、网络请求等),CPU 大部分时间是空闲的。 线程数设置:对于 I/O 密集型任务,可以设置的线程数比逻辑核数多(如 1.5-3 倍)。更多的线程可以在等待 I/O 完成时执行其他线程的任务,从而提高 CPU 利用率。
CPU 密集型任务
特点:CPU 密集型任务需要大量计算,CPU 占用率较高。这样的任务通常会占满 CPU 核心,因此线程数不宜过多。 线程数设置:对于 CPU 密集型任务,线程数应接近物理核数,通常不超过逻辑核数。这样每个核心可以集中于执行少量线程,减少上下文切换的开销。
5. 超线程技术的影响
在支持超线程的 CPU 中,适当增加线程数可以提高并行度,因为每个物理核心可以支持两个逻辑线程。但是要注意以下几点:
超线程并非增加实际的物理核心,而是增加逻辑线程,多个线程仍然共享物理核心的资源。 对于 CPU 密集型任务,增加线程数并不会带来成比例的性能提升,反而可能因为资源争用而影响性能。 对于 I/O 密集型任务,超线程有一定的好处,可以提高 CPU 的利用率。
6. 线程数的设置策略
CPU 密集型任务:线程数应接近或等于物理核数,适当考虑逻辑核数。 I/O 密集型任务:线程数可以超过逻辑核数,一般设置为逻辑核数的 2-3 倍效果较好。
7. 线程数与上下文切换
当线程数过多时,会导致频繁的上下文切换。上下文切换需要保存和恢复线程的执行状态,这会占用 CPU 时间,从而影响程序性能。因此,设置的线程数应适当,避免过多的线程在同一核心上竞争执行。
总结
合理设置线程数可以提升程序性能。一般建议:
CPU 密集型任务:线程数不超过物理核心数,减少上下文切换。 I/O 密集型任务:线程数可以超过逻辑核数,利用 CPU 等待时间。
总的来说,线程数的设置要结合 CPU 的核数和任务特性,才能实现最佳的资源利用和程序性能。
开放性问题
Rocky从工业界、学术界、竞赛界以及应用界角度出发,思考总结AI行业的干货开放性问题,这些问题不仅能够用于面试官的提问,也可以用作面试者的提问,在面试的最后阶段让面试双方进入深度的探讨与交流。
与此同时,这些开放性问题也是贯穿我们职业生涯的本质问题,需要我们持续的思考感悟。这些问题没有标准答案,Rocky相信大家心中都有自己对于AI行业的认知与判断,欢迎大家在留言区分享与评论。
【一】AI算法工程师在从事技术管理时该如何与不同部门协作?
Rocky认为这是一个非常有价值的问题,不管是AIGC领域、传统深度学习领域还是自动驾驶领域,在从事技术管理阶段,都需要我们大刀阔斧的提升大局观认知、增强思维全面性以及加深对人性基本面的洞察。
【二】如何针对AI业务的优先级进行轻重缓急排序?
在AI领域,如何针对AI业务的优先级进行轻重缓急排序,是非常重要的一环,我们需要根据实际情况,不断的调整处理事情的轻重缓急,才能发挥出更高的效率。
推荐阅读
1、加入AIGCmagic社区知识星球!
AIGCmagic社区知识星球不同于市面上其他的AI知识星球,AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100+应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等干货。
那该如何加入星球呢?很简单,我们只需要扫下方的二维码即可。知识星球原价:299元/年,前200名限量活动价,终身优惠只需199元/年。大家只需要扫描下面的星球优惠卷即可享受初始居民的最大优惠:
2、Sora等AI视频大模型的核心原理,核心基础知识,网络结构,经典应用场景,从0到1搭建使用AI视频大模型,从0到1训练自己的AI视频大模型,AI视频大模型性能测评,AI视频领域未来发展等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
Sora等AI视频大模型文章地址:https://zhuanlan.zhihu.com/p/706722494
3、Stable Diffusion 3和FLUX.1核心原理,核心基础知识,网络结构,从0到1搭建使用Stable Diffusion 3和FLUX.1进行AI绘画,从0到1上手使用Stable Diffusion 3和FLUX.1训练自己的AI绘画模型,Stable Diffusion 3和FLUX.1性能优化等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
Stable Diffusion 3和FLUX.1文章地址:https://zhuanlan.zhihu.com/p/684068402
4、Stable Diffusion XL核心基础知识,网络结构,从0到1搭建使用Stable Diffusion XL进行AI绘画,从0到1上手使用Stable Diffusion XL训练自己的AI绘画模型,AI绘画领域的未来发展等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
Stable Diffusion XL文章地址:https://zhuanlan.zhihu.com/p/643420260
5、Stable Diffusion 1.x-2.x核心原理,核心基础知识,网络结构,经典应用场景,从0到1搭建使用Stable Diffusion进行AI绘画,从0到1上手使用Stable Diffusion训练自己的AI绘画模型,Stable Diffusion性能优化等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
Stable Diffusion文章地址:https://zhuanlan.zhihu.com/p/632809634
6、ControlNet核心基础知识,核心网络结构,从0到1使用ControlNet进行AI绘画,从0到1训练自己的ControlNet模型,从0到1上手构建ControlNet商业变现应用等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
ControlNet文章地址:https://zhuanlan.zhihu.com/p/660924126
7、LoRA系列模型核心原理,核心基础知识,从0到1使用LoRA模型进行AI绘画,从0到1上手训练自己的LoRA模型,LoRA变体模型介绍,优质LoRA推荐等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
LoRA文章地址:https://zhuanlan.zhihu.com/p/639229126
8、Transformer核心基础知识,核心网络结构,AIGC时代的Transformer新内涵,各AI领域Transformer的应用落地,Transformer未来发展趋势等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
Transformer文章地址:https://zhuanlan.zhihu.com/p/709874399
9、最全面的AIGC面经《手把手教你成为AIGC算法工程师,斩获AIGC算法offer!(2024年版)》文章正式发布!
码字不易,欢迎大家多多点赞:
AIGC面经文章地址:https://zhuanlan.zhihu.com/p/651076114
10、50万字大汇总《“三年面试五年模拟”之算法工程师的求职面试“独孤九剑”秘籍》文章正式发布!
码字不易,欢迎大家多多点赞:
算法工程师三年面试五年模拟文章地址:https://zhuanlan.zhihu.com/p/545374303
《三年面试五年模拟》github项目地址(希望大家能多多star):https://github.com/WeThinkIn/Interview-for-Algorithm-Engineer
11、Stable Diffusion WebUI、ComfyUI、Fooocus三大主流AI绘画框架核心知识,从0到1搭建AI绘画框架,从0到1使用AI绘画框架的保姆级教程,深入浅出介绍AI绘画框架的各模块功能,深入浅出介绍AI绘画框架的高阶用法等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
AI绘画框架文章地址:https://zhuanlan.zhihu.com/p/673439761
12、GAN网络核心基础知识,网络架构,GAN经典变体模型,经典应用场景,GAN在AIGC时代的商业应用等全维度解析文章正式发布!
码字不易,欢迎大家多多点赞:
GAN网络文章地址:https://zhuanlan.zhihu.com/p/663157306
13、其他
Rocky将YOLOv1-v7全系列大解析文章也制作成相应的pdf版本,大家可以关注公众号WeThinkIn,并在后台 【精华干货】菜单或者回复关键词“YOLO” 进行取用。