AIGC时代算法工程师的面试秘籍(第二十八式2024.12.2-12.15) |【三年面试五年模拟】

文摘   科技   2024-12-15 20:49   浙江  
近期文章回顾(更多热门文章请关注公众号与知乎Rocky Ding哦)

写在前面

【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试经验,力求让读者在获得心仪offer的同时,增强技术基本面。

Rocky最新发布Stable Diffusion 3和FLUX.1系列模型的深入浅出全维度解析文章,点击链接直达干货知识:https://zhuanlan.zhihu.com/p/684068402


大家好,我是Rocky。

又到了定期学习《三年面试五年模拟》文章的时候了!本周期共更新了80多个AIGC面试高频问答,依旧干货满满!诚意满满!

《三年面试五年模拟》系列文章帮助很多读者获得了心仪的算法岗offer,收到了大家的很多好评,Rocky觉得很开心也很有意义。

在AIGC时代到来后,Rocky对《三年面试五年模拟》整体战略方向进行了重大的优化重构,在秉持着Rocky创办《三年面试五年模拟》项目初心的同时,增加了AIGC时代核心的版块栏目,详细的版本更新内容如下所示:

  1. 整体架构:分为AIGC知识板块和AI通用知识板块。
  2. AIGC知识板块:分为AI绘画、AI视频、大模型、AI多模态、数字人这五大AIGC核心方向。
  3. AI通用知识板块:包含AIGC、传统深度学习、自动驾驶等所有AI核心方向共通的知识点。

Rocky已经将《三年面试五年模拟》项目的完整版构建在Github上:https://github.com/WeThinkIn/Interview-for-Algorithm-Engineer/tree/main,本周期更新的80+AIGC面试高频问答已经全部同步到项目中了,欢迎大家star!

本文是《三年面试五年模拟》项目的第二十八式,考虑到易读性与文章篇幅,Rocky本次只从Github完整版项目中摘选了2024年12月2号-2024年12月15号更新的部分高频&干货面试知识点和面试问题,并配以相应的参考答案(精简版),供大家学习探讨。

《三年面试五年模拟》版本更新白皮书,迎接AIGC时代中我们阐述了《三年面试五年模拟》项目在AIGC时代的愿景与规划,也包含了项目共建计划,感兴趣的朋友可以一起参与本项目的共建!

《三年面试五年模拟》系列将陪伴大家度过整个AI行业的职业生涯,并且让大家能够持续获益。

So,enjoy(与本文的BGM一起食用更佳哦):

正文开始

目录先行

AI绘画基础:

  1. 介绍一下OFT(Orthogonal-Finetuning)微调技术

  2. Stable Diffusion 3的Text Encoder有哪些改进?

AI视频基础:

  1. Sora的最新功能有哪些?

  2. Sora支持哪几种多模态输入?

深度学习基础:

  1. LayerNorm有什么作用?

  2. 不同模态的数据如何进行Token化操作?

机器学习基础:

  1. 介绍一下机器学习中的Huber-Loss损失函数

  2. 介绍一下机器学习中不同聚类算法的性能特点

Python编程基础:

  1. AI服务的Python代码用PyTorch框架重写优化的过程中,有哪些方法论和注意点?

  2. 在Python中,图像格式在Pytorch的Tensor格式、Numpy格式、OpenCV格式、PIL格式之间如何互相转换?

模型部署基础:

  1. 什么是AIGC模型的Model-Offloading策略?

  2. 介绍一下NF4精度的特点

计算机基础:

  1. 计算机中两个AI服务,一个AI服务调用另外一个AI服务时,该如何设置两者ip地址和端口号?

  2. 介绍一下计算机中DNS(Domain-Name-System)的概念

开放性问题:

  1. AI算法工程师如何以AI技术为核心,向外扩展更多基本面能力?

  2. 如何对AI业务的本质价值进行挖掘与总结?

AI绘画基础

【一】介绍一下OFT(Orthogonal-Finetuning)微调技术

Orthogonal Finetuning (OFT) 是一种在AIGC模型微调过程中使用的技术,旨在通过引入正交性约束来减少模型在迁移学习过程中的灾难性遗忘(catastrophic forgetting),同时提升微调效率和模型的泛化能力。具有以下特点:

  • 原理:限制参数更新在一个正交子空间内,减少对原始任务的破坏。
  • 作用:抑制灾难性遗忘、提升泛化能力、加速优化过程。
  • 优势:灵活性强、鲁棒性高,适合多任务学习、迁移学习和增量学习。

通过正交矩阵 的引入,OFT 有效平衡了模型对旧任务的记忆和新任务的适应,是一种实用且高效的微调方法,适合AIGC领域、传统深度学习领域、自动驾驶领域的广泛应用场景。

1. OFT 的核心思想

OFT 的核心思想是将模型微调时的参数更新限制在一个特定的子空间内,这个子空间由正交矩阵 定义。通过这种方式,可以在微调新任务时尽可能保留原始任务的重要信息。

  • 传统微调

    • 在微调过程中,模型的所有参数都可能被更新,容易导致对原始任务的性能显著下降(灾难性遗忘)。
  • OFT 微调

    • 通过正交矩阵约束,模型的参数更新仅在特定方向上进行,这样可以减少对原始任务表示的破坏,同时提高对新任务的适配性。

2. OFT 的数学表达

假设模型的原始权重为 ,新的权重为 ,OFT 的更新公式为:

其中 被限制在一个正交子空间中:

  • :表示原始模型的权重。
  • :一个正交矩阵(满足 ),定义了允许的更新方向。

3. OFT 的关键步骤

  1. **构造正交矩阵 **:

  • 是随机初始化的正交矩阵,或者通过优化过程学习得到。
  • 正交性(orthogonality)保证了 中的列向量是线性独立的,这样更新不会偏离预期方向。
  • 限制更新方向

    • 使用 确保微调的权重变化始终处于一个受限的子空间中。
    • 这种约束可以通过优化正则化项实现。
  • 模型训练

    • :主任务的损失函数。
    • :正交性约束的损失(Frobenius 范数)。
    • :超参数,用于平衡两部分损失。
    • 在标准的优化过程中加入正交性约束,通常表现为损失函数中的一个额外项:

    4. OFT 的作用

    4.1 减少灾难性遗忘

    • 灾难性遗忘 是指模型在学习新任务时丧失对原始任务的表现能力。
    • 通过限制参数更新的方向,OFT 可以在适配新任务的同时尽量保留原始任务的表示,从而显著减少灾难性遗忘。

    4.2 提升微调效率

    • OFT 的正交约束减少了参数的更新自由度,相当于对更新进行了剪枝。这种方式可以加速优化过程,并在有限的计算资源下获得更好的性能。

    4.3 提高模型的泛化能力

    • 正交性约束通过限制权重更新的方向,可以避免过度拟合新任务的数据。这种正则化效果有助于提升模型在新任务上的泛化能力。

    4.4 灵活适配不同任务

    • OFT 的正交矩阵 可以针对不同任务动态调整,因此可以在多任务学习中实现高效的知识迁移。

    5. OFT 的优势

    1. 参数更新的灵活性

    • OFT 不需要冻结模型的部分权重,而是通过正交子空间限制更新,这样可以更灵活地适应新任务。
  • 减少过拟合的风险

    • 正交性约束使模型的更新更具方向性,从而减少了对新任务数据的过拟合。
  • 鲁棒性强

    • 在存在较大任务差异的情况下,OFT 能够更稳定地完成新任务的适配。
  • 兼容性高

    • OFT 可以与现有的优化技术(如 SGD、Adam)无缝结合,也适用于多种深度学习框架。

    6. OFT 的实际应用场景

    6.1 迁移学习

    • 在从大规模预训练模型(如 BERT、ResNet)微调到小规模任务时,OFT 可以有效提升性能。

    6.2 多任务学习

    • 在同时处理多个任务时,OFT 可以限制参数更新的方向,避免任务之间的干扰。

    6.3 增量学习

    • 在模型需要学习新类别或新数据时,OFT 可以防止模型对旧类别的遗忘。

    6.4 目标检测与图像分割

    • 在计算机视觉任务中,OFT 可以帮助模型在适配新数据时保留原始特征提取的能力。

    7. 与其他微调方法的对比

    方法参数更新范围对灾难性遗忘的抑制实现复杂度适用场景
    标准微调无限制较差简单大任务或相似任务
    冻结部分参数仅更新部分参数中等较低旧任务重要性高的场景
    L2 正则化微调全参数更新 + 正则化限制一般较低泛化能力要求较高
    OFT全参数更新 + 正交性限制较强中等灾难性遗忘风险高的场景

    8. OFT 的潜在挑战

    1. 正交矩阵的计算开销

    • 正交矩阵 的构造和正交性约束的优化会增加一定的计算复杂度。
  • 超参数调节

    • 正交性约束的强度 需要根据任务进行调整,可能增加调参的复杂性。
  • 对大规模任务的扩展性

    • 在特别大的模型(如 GPT-4)或任务中,如何高效地应用 OFT 是一个研究方向。

    【二】Stable Diffusion 3的Text Encoder有哪些改进?

    作为当前最强的AI绘画大模型之一,Stable Diffusion 3模型都是AIGC算法岗面试中的必考内容。接下来,Rocky将带着大家深入浅出讲解Stable Diffusion 3模型的Text Encoder部分是如何改进的。

    Stable Diffusion 3的文字渲染能力很强,同时遵循文本Prompts的图像生成一致性也非常好,这些能力主要得益于SD 3采用了三个Text Encoder模型,它们分别是:

    1. CLIP ViT-L(参数量约124M)
    2. OpenCLIP ViT-bigG(参数量约695M)
    3. T5-XXL Encoder(参数量约4.76B)

    在SD系列模型的版本迭代中,Text Encoder部分一直在优化增强。一开始SD 1.x系列的Text Encoder部分使用了CLIP ViT-L,在SD 2.x系列中换成了OpenCLIP ViT-H,到了SDXL则使用CLIP ViT-L + OpenCLIP ViT-bigG的组合作为Text Encoder。有了之前的优化经验,SD 3更进一步增加Text Encoder的数量,加入了一个参数量更大的T5-XXL Encoder模型。

    与SD模型的结合其实不是T5-XXL与AI绘画领域第一次结缘,早在2022年谷歌发布Imagen时,就使用了T5-XXL Encoder作为Imagen模型的Text Encoder,并证明了预训练好的纯文本大模型能够给AI绘画大模型提供更优良的文本特征。接着OpenAI发布的DALL-E 3也采用了T5-XXL Encoder来提取文本(Prompts)的特征信息,足以说明T5-XXL Encoder模型在AI绘画领域已经久经考验。

    这次SD 3加入T5-XXL Encoder也是其在文本理解能力和文字渲染能力大幅提升的关键一招。Rocky认为在AIGC时代,随着各细分领域大模型技术的持续繁荣,很多灵感创新都可以在AI绘画领域中迁移借鉴与应用,从而推动AI绘画大模型的持续发展与升级!

    总的来说,SD 3一共需要提取输入文本的全局语义和文本细粒度两个层面的信息特征

    首先需要提取CLIP ViT-L和OpenCLIP ViT-bigG的Pooled Text Embeddings,它们代表了输入文本的全局语义特征,维度大小分别是768和1280,两个embeddings拼接(concat操作)得到2048的embeddings,然后经过一个MLP网络并和Timestep Embeddings相加(add操作)。

    接着我们需要提取输入文本的细粒度特征。这里首先分别提取CLIP ViT-L和OpenCLIP ViT-bigG的倒数第二层的特征,拼接在一起得到77x2048维度的CLIP Text Embeddings;再从T5-XXL Encoder中提取最后一层的T5 Text Embeddings特征,维度大小是77x4096(这里也限制token长度为77)。紧接着对CLIP Text Embeddings使用zero-padding得到和T5 Text Embeddings相同维度的编码特征。最后,将padding后的CLIP Text Embeddings和T5 Text Embeddings在token维度上拼接在一起,得到154x4096维度的混合Text Embeddings。这个混合Text Embeddings将通过一个linear层映射到与图像Latent的Patch Embeddings特征相同的维度大小,最终和Patch Embeddings拼接在一起送入MM-DiT中。具体流程如下图所示:

    SD 3中Text Encoder注入和融合文本特征的示意图

    虽然SD 3采用CLIP ViT-L + OpenCLIP ViT-bigG + T5-XXL Encoder的组合带来了文字渲染和文本一致性等方面的效果增益,但是也限制了T5-XXL Encoder的能力。因为CLIP ViT-L和OpenCLIP ViT-bigG都只能默认编码77 tokens长度的文本,这让原本能够编码512 tokens的T5-XXL Encoder在SD 3中也只能处理77 tokens长度的文本。而SD系列的“友商”模型DALL-E 3由于只使用了T5-XXL Encoder一个语言模型作为Text Encoder模块,所以可以输入512 tokens的文本,从而发挥T5-XXL Encoder的全部能力。

    更多详细内容,大家可以查阅:https://zhuanlan.zhihu.com/p/684068402

    AI视频基础

    【一】Sora的最新功能有哪些?

    1. 可以生成 1080p 分辨率、最长 20 秒、宽屏、竖屏或方形的视频。
    2. 使用 Remix 替换、删除或重新构想视频中的元素。
    3. 通过 Re-cut 找到并隔离最佳帧,然后向任一方向延伸它们以完成场景。
    4. 通过 Storyboard 在时间线上组织和编辑视频的独特序列。
    5. 使用 Loop 剪辑并创建无缝重复的视频。
    6. 通过 Blend 将两个视频合并为一个无缝剪辑。
    7. 通过Style presets 创建独特的风格。

    【二】Sora支持哪几种多模态输入?

    1. 文本到视频(Text-to-Video)模式:这是Sora的核心功能之一,它允许用户仅通过输入文本描述就能生成完整的视频内容。依托于先进的自然语言处理技术和生成模型,Sora能够准确把握文字的精髓,将其转化为生动的视觉画面。无论是制作简短的短视频还是构建情节丰富的叙事视频,这一模式都能帮助创作者轻松实现他们的创意构想。
    2. 文本+图像到视频(Text+Image-to-Video)模式:在这一模式下,用户不仅可以提供文本描述,还能上传图像来辅助视频的生成过程。通过结合文本和图像,Sora能够更精确地理解并展现创作者的创意意图,制作出更符合视觉预期的视频内容。这一功能特别适合需要在视频中融入特定图像元素的场景,如广告制作、产品展示等,为创作者提供了更多的创意空间。
    3. 文本+视频到视频(Text+Video-to-Video)模式:Sora还提供了视频编辑和转换的功能,用户可以上传已有的视频素材,并结合文本描述进行修改或扩展。这一模式让用户能够在现有视频的基础上,添加新的情节、细节,甚至创作出全新的版本或完全不同的内容。例如,用户可以对现有的广告视频进行重新编辑,加入新的对话、场景或动画效果,从而提升视频的吸引力和表现力。

    深度学习基础

    【一】LayerNorm有什么作用?

    Layer Normalization 是一种归一化技术,最初由 Geoffrey Hinton 等人提出,用于AIGC、传统深度学习以及自动驾驶中的模型训练,尤其是在序列建模和自然语言处理任务中效果显著。

    LayerNorm 的主要作用是通过对特征维度归一化,稳定模型训练过程,减少对 batch size 的依赖,特别适合序列建模、Transformer 等场景。

    1. LayerNorm 的定义

    LayerNorm 的核心是对输入的一层神经元的所有特征维度进行归一化处理,而不是像 BatchNorm 那样对整个 mini-batch 的样本进行归一化。

    数学表达:

    对于输入 (通常是序列数据,其中 是时间步长, 是特征维度),LayerNorm 对每个时间步的特征维度 进行归一化:

    其中:

    • :特征维度的均值。
    • :特征维度的方差。
    • :一个小的正值,用于防止分母为零(数值稳定性)。

    经过归一化后,再进行线性变换:

    • :可学习的参数(与输入维度 相同),用于恢复网络的表达能力。

    2. LayerNorm 的作用

    2.1. 缓解内部协变量偏移(Internal Covariate Shift)

    在训练过程中,神经网络的每一层输入分布会随着权重更新而变化,导致模型需要不断适应新的分布,影响训练的稳定性。LayerNorm 通过将每一层的输入归一化为零均值和单位方差,有效缓解了这种问题。

    2.2. 提高梯度传播的稳定性

    通过归一化,LayerNorm 减少了输入特征的动态范围波动,避免了梯度爆炸或梯度消失的问题,有助于深层神经网络的训练。

    2.3. 更适用于序列建模任务

    与 BatchNorm 依赖 mini-batch 的均值和方差不同,LayerNorm 仅依赖于样本内部的特征维度统计量。这使得 LayerNorm 能够适用于 RNN、Transformer 等序列模型,特别是在处理小批量数据或单样本输入时效果突出。

    2.4. 减少对 batch size 的依赖

    BatchNorm 在小批量或不规则 batch size 场景中性能会下降,而 LayerNorm 不受 batch size 的影响,能够在单样本推理或小样本学习中表现稳定。

    3. 应用场景

    1. Transformer 模型

    • Transformer 中广泛使用 LayerNorm,例如在自注意力机制和前馈网络中对输入进行归一化。
    • 通过归一化提升训练稳定性和模型收敛速度。
  • RNN 和 LSTM

    • LayerNorm 在序列建模(如 NLP 和时间序列任务)中表现优异,适用于 RNN、LSTM 和 GRU 的内部状态归一化。
  • 小批量或单样本训练

    • LayerNorm 不依赖 batch size,因此在小批量或单样本输入任务(如强化学习、对话系统)中效果显著。

    4. 注意事项

    1. 计算成本

    • LayerNorm 在特征维度上进行归一化,相比 BatchNorm 对大特征维度数据的计算开销更高。
  • 适配任务

    • LayerNorm 更适合序列任务和 NLP 模型;对于卷积网络任务,GroupNorm 或 BatchNorm 可能更高效。
  • 小数据集场景

    • 当 batch size 无法足够大时,LayerNorm 比 BatchNorm 更稳定。

    【二】不同模态的数据如何进行Token化操作?

    在AI行业中,不同模态的数据(如文本、图像、音频、视频、表格等)通常需要经过Token化操作,将数据转换为模型能够处理的标准化表示形式。这种操作的目标是将输入数据转化为一系列离散的表示(Token),便于输入到 Transformer 或其他AI网络结构中进行处理。

    在AIGC、传统深度学习以及自动驾驶领域中,不同模态的数据具有各自的特性,Token 化需要针对性设计:

    • 文本:BPE 和子词级 Token 化是主流。
    • 图像:Patch Token 化和 VQ-VAE 被广泛应用。
    • 音频:频谱图和帧级特征是常见方法。
    • 视频:空间时间 Patch 和 CNN+RNN 是主流方案。
    • 多模态融合:通过独立 Token 化和跨模态注意力机制实现。

    下面Rocky详细讲解常见模态的数据及其 Token 化方法:

    1. 文本模态

    文本数据的 Token 化是最成熟的领域之一,方法包括:

    1.1. 基于词级的 Token 化

    • 方法
      • 将文本拆分为单词,通常通过空格分割。
      • 每个单词分配一个唯一的索引。
    • 优点
      • 简单易用,训练和推理速度较快。
    • 缺点
      • 词表较大(尤其对多语言),无法处理未登录词(OOV)。
    • 示例
      text = "Deep learning is amazing!"
      tokens = ["Deep""learning""is""amazing""!"]

    1.2. 基于子词的 Token 化

    • 方法
      • 使用 BPE(Byte Pair Encoding)、WordPiece、Unigram 等算法,将文本拆分为子词单元。
    • 优点
      • 词表大小可控,能够高效处理未登录词。
    • 应用
      • GPT 使用 BPE,BERT 使用 WordPiece。
    • 示例
      text = "unbelievable"
      tokens = ["un""##believ""##able"]

    1.3. 字符级 Token 化

    • 方法
      • 将文本按字符拆分,每个字符作为一个 Token。
    • 优点
      • 无需复杂的预处理,天然支持多语言。
    • 缺点
      • 序列长度较长,效率较低。
    • 示例
      text = "Hello"
      tokens = ["H""e""l""l""o"]

    1.4. 字节级 Token 化

    • 方法
      • 将文本按字节级拆分。
    • 优点
      • 高效支持任意字符集。
    • 应用
      • OpenAI 的 CLIP 和 GPT 使用字节级 BPE。
    • 示例
      text = "你好"
      tokens = [206149206189]

    2. 图像模态

    对于图像数据,Token 化需要将二维的像素阵列转换为一维 Token 序列:

    2.1. Patch Tokenization(视觉 Transformer 方法)

    • 方法
      • 将图像分割为固定大小的 Patch,每个 Patch 被展平为向量。
      • 对每个 Patch 使用线性变换将其映射到 Token 表示空间。
    • 优点
      • 高效,将图像处理问题转化为序列问题。
    • 应用
      • ViT(Vision Transformer)、CLIP。
    • 示例
      patches = image_to_patches(image, patch_size=16)  # 分割为 16x16 的 Patch
      tokens = linear_projection(patches)  # 线性变换
      • 输入图像大小 (224 \times 224 ),Patch 大小 (16 \times 16),输出序列长度 ( (224/16)^2 = 196 )。

    2.2. CNN Feature Maps

    • 方法
      • 使用 CNN 提取特征图,每个特征点作为一个 Token。
    • 优点
      • 适合与 Transformer 结合的场景。
    • 示例
      feature_map = cnn_model(image)  # 输出特征图 (H, W, C)
      tokens = feature_map.reshape(-1, feature_map.shape[-1])  # 转换为序列

    2.3. 离散化向量量化(VQ-VAE 方法)

    • 方法
      • 使用 VQ-VAE 将图像压缩到离散的 Token 表示。
    • 优点
      • 适合生成任务,如 DALL-E。
    • 示例
      quantized_tokens = vq_vae(image)

    3. 音频模态

    音频数据通常是连续的波形信号,需要离散化处理:

    3.1. 频谱图 Token 化

    • 方法
      • 将音频信号转换为频谱图,类似于图像。
      • 使用 Patch 或 CNN 方法进行 Token 化。
    • 示例
      spectrogram = waveform_to_spectrogram(audio)  # 转为频谱图
      tokens = image_to_patches(spectrogram, patch_size=16)

    3.2. 离散化向量量化(VQ-VAE)

    • 方法
      • 使用 VQ-VAE 将音频频谱图压缩为离散的 Token。
    • 应用
      • AudioLM、Jukebox。
    • 示例
      quantized_tokens = vq_vae(audio)

    3.3. 帧级 Token 化

    • 方法
      • 将音频分割为固定长度的帧(如 20 ms)。
      • 每帧使用特征提取器(如 MFCC、Mel 特征)。
    • 示例
      frames = audio_to_frames(audio, frame_size=20)
      tokens = [mfcc(frame) for frame in frames]

    4. 视频模态

    视频数据的 Token 化通常需要同时考虑时间和空间维度:

    4.1. 空间时间 Patch

    • 方法
      • 对每一帧应用 Patch Token 化,将其展平为序列。
      • 在时间维度上叠加帧序列。
    • 应用
      • Video Transformer。
    • 示例
      video_patches = [image_to_patches(frame, patch_size=16for frame in video]
      tokens = concatenate(video_patches, axis=0)

    4.2. CNN+RNN Token 化

    • 方法
      • 使用 CNN 提取每帧的特征,RNN 聚合时间信息。
    • 示例
      frame_features = [cnn_model(frame) for frame in video]
      tokens = rnn_model(frame_features)

    5. 表格模态

    表格数据的 Token 化主要考虑行、列和单元格:

    5.1. 单元格级 Token 化

    • 方法
      • 将每个单元格作为一个 Token,可能需要处理数值和文本的混合数据。
    • 示例
      tokens = [tokenize(cell) for row in table for cell in row]

    5.2. 列级 Token 化

    • 方法
      • 将每列的值序列化,并作为一组 Token。
    • 示例
      tokens = [tokenize(column) for column in table.T]

    6. 多模态融合的 Token 化

    当需要同时处理多模态数据时(如 CLIP),需要对各模态的数据进行独立 Token 化后再融合:

    6.1. 独立 Token 化后对齐

    • 文本:使用文本 Token 化(如 BPE)。
    • 图像:使用 Patch Token 化。
    • 最终通过共享的 Transformer 模型对 Token 进行处理。

    6.2. 融合注意力机制

    • 使用跨模态的注意力机制(Cross-Attention)来融合不同模态的 Token。
    • 示例
      text_tokens = text_tokenizer(text)
      image_tokens = image_tokenizer(image)
      fused_tokens = cross_attention([text_tokens, image_tokens])

    机器学习基础

    【一】介绍一下机器学习中的Huber-Loss损失函数

    Huber Loss 是一种用于回归问题的损失函数,它结合了均方误差(MSE)和绝对误差(MAE)的优点,主要用于对异常值(outliers)具有鲁棒性的场景。Huber Loss 在小误差时表现为 MSE,在大误差时表现为 MAE,结合了两者的优点。它特别适合含有异常值的回归问题,能够在对小误差敏感的同时,对异常值具备较强的鲁棒性。

    Huber Loss公式

    Huber Loss的公式如下:

    • :预测值与真实值的残差。
    • :控制损失函数转变点的超参数。

    分段理解

    1. **小误差情况 **):

    • 损失函数为平方误差,即 。这一部分对误差较小的点较敏感,可以有效优化小范围内的误差。
  • **大误差情况 **):

    • 损失函数转为线性形式: 。在这一部分,对误差的增长速度进行限制,从而减小异常值对模型的影响。

    Huber Loss的优点

    1. 对小误差敏感

    • 在误差较小的情况下,Huber Loss与MSE相同,能够提供较好的梯度信息,使模型更快速地收敛。
  • 对异常值具有鲁棒性

    • 在误差较大的情况下,Huber Loss切换到线性增长,类似于MAE,从而避免了异常值对总体损失的过大影响。

    与MSE和MAE的对比

    损失函数对小误差的表现对大误差的表现梯度特性优缺点
    MSE敏感非常敏感平滑(连续)优点:小误差优化效果好;缺点:对异常值过于敏感。
    MAE不敏感稳定梯度不连续优点:鲁棒性强;缺点:梯度信息有限,优化过程不够高效。
    Huber敏感稳定平滑(连续)综合了MSE和MAE的优点:既对小误差敏感,又对大误差鲁棒。

    Huber Loss的应用场景

    1. 回归问题

    • 预测房价、股市数据、机器设备寿命等回归任务中,尤其当数据可能存在异常值时。
  • 异常值处理

    • 当数据中包含异常点(outliers),但不希望它们对模型的训练产生过大影响时。
  • 鲁棒优化

    • 需要平衡模型对误差的敏感性和对异常点的鲁棒性时。
  • AIGC时代

    • 图像生成任务、视频生成任务等。

    超参数 的选择

    • 是 Huber Loss 的一个关键超参数:
      • 较小的 :更接近 MSE,适合误差较小的数据集。
      • 较大的 :更接近 MAE,适合误差较大的数据集(或者有更多异常值的场景)。

    通常,可以通过交叉验证来选择最优的

    Huber Loss的梯度

    Huber Loss 的梯度可以分段表示:

    • 这种梯度形式使得 Huber Loss 在不同误差区间具有良好的可优化性。

    【二】介绍一下机器学习中不同聚类算法的性能特点

    算法名称可伸缩性适合的数据类型高维性异常数据抗干扰性聚类形状算法效率
    WAVECLUSTER很高数值型很高较高任意形状很高
    ROCK很高混合型很高很高任意形状一般
    BIRCH较高数值型较低较低球形很高
    CURE较高数值型一般很高任意形状较高
    K-PROTOTYPES一般混合型较低较低任意形状一般
    DENCLUE较低数值型较高一般任意形状较高
    OPTIGRID一般数值型较高一般任意形状一般
    CLIQUE较高数值型较高较高任意形状较低
    DBSCAN一般数值型较低较高任意形状一般
    CLARANS较低数值型较低较高球形较低

    Python编程基础

    【一】AI服务的Python代码用PyTorch框架重写优化的过程中,有哪些方法论和注意点?

    在AI行业中,不管是AIGC、传统深度学习还是自动驾驶领域,对AI服务的性能都有持续的要求,所以我们需要将AI服务中的Python代码用PyTorch框架重写优化。有以下方法论和注意点可以帮助我们提升AI服务的代码质量、性能和可维护性:

    1. 方法论

    1.1. 模块化设计

    • 分离模型与数据处理:

      • 使用 torch.nn.Module 定义模型,将模型的逻辑与数据处理逻辑分开。
      • 利用 PyTorch 的 DataLoaderDataset 进行数据加载和批处理。
    • 函数式编程与可复用性:

      • 将优化器、损失函数、学习率调度器等单独封装为独立函数或类,便于调整和测试。

    1.2. 面向性能优化

    • 张量操作优先:

      • 避免循环操作,尽可能使用 PyTorch 的张量操作(Tensor operations)来实现并行计算。
    • 混合精度训练:

      • 使用 torch.cuda.amp 提升 GPU 计算效率,同时减少内存占用。
    • 模型加速工具:

      • 使用 torch.jit 对模型进行脚本化(scripting)或追踪(tracing)优化。
      • 使用 torch.compile(若适用的 PyTorch 版本支持)进一步优化模型性能。

    2. 注意点

    2.1. 正确性与鲁棒性

    • 模型初始化:

      • 使用适当的权重初始化方法(如 Xavier 或 He 初始化)。
      • 检查 requires_grad 属性,确保需要优化的参数被正确更新。
    • 梯度检查:

      • torch.autograd.gradcheck 检查梯度计算是否正确。
    • 数值稳定性:

      • 对损失函数(如交叉熵)使用内置函数以避免数值问题。
      • 在训练中加入梯度裁剪(Gradient Clipping)以防止梯度爆炸。

    2.2. 性能与效率

    • 数据管道优化:

      • 确保 DataLoader 中的 num_workerspin_memory 设置合理。
      • 对数据预处理操作(如归一化)进行矢量化实现。
    • 批量大小调整:

      • 在显存允许的情况下增大批量大小(batch size),提高 GPU 利用率。
    • 避免重复计算:

      • 对固定张量或权重计算结果进行缓存,避免多次重复计算。

    2.3. GPU 与分布式训练

    • 设备管理:

      • 确保张量和模型都正确移动到 GPU 上(to(device))。
      • 使用 torch.nn.DataParalleltorch.distributed 进行多卡训练。
    • 同步问题:

      • 在分布式环境中确保梯度同步,尤其在使用自定义操作时。

    2.4. 可维护性

    • 文档与注释:

      • 为复杂的模块和函数提供清晰的注释和文档。
    • 版本兼容性:

      • 检查所使用的 PyTorch 版本及其依赖库是否兼容。

    2.5. 安全性与复现

    • 随机种子:

      • 固定随机种子以确保实验结果可复现(torch.manual_seedtorch.cuda.manual_seed 等)。
    • 环境隔离:

      • 使用虚拟环境(如 Conda 或 venv)管理依赖,避免版本冲突。

    3. 额外工具与库

    • 性能监控:

      • 使用 torch.profiler 分析性能瓶颈。
    • 调试工具:

      • 使用 torch.utils.checkpoint 实现高效的内存检查点功能。
    • 辅助库:

      • PyTorch Lightning:提供简化的训练循环管理。
      • Hydra:便于管理复杂配置。
      • Hugging Face Transformers:用于自然语言处理领域的预训练模型。

    【二】在Python中,图像格式在Pytorch的Tensor格式、Numpy格式、OpenCV格式、PIL格式之间如何互相转换?

    在Python中,图像格式在 PyTorch 的 Tensor 格式、Numpy 数组格式、OpenCV 格式以及 PIL 图像格式之间的转换是AI行业的常见任务。下面是Rocky总结的这些格式之间转换的具体方法:

    1. 格式概览

    • PyTorch Tensor: PyTorch 的张量格式,形状通常为 ,通道在最前(Channel-First)。

    • Numpy 数组: 一种通用的多维数组格式,形状通常为 ,通道在最后(Channel-Last)。

    • OpenCV 格式: 一种常用于计算机视觉的图像格式,通常以 Numpy 数组存储,颜色通道顺序为 BGR。

    • PIL 图像格式: Python 的图像库,格式为 PIL.Image 对象,支持 RGB 格式。

    • 通道顺序: 注意 OpenCV 使用 BGR,而 PyTorch 和 PIL 使用 RGB。

    • 形状差异: PyTorch 使用 ,其他通常使用

    • 归一化: Tensor 格式通常使用归一化范围 ,而 Numpy 和 OpenCV 通常为整数范围

    2. 转换方法

    2.1. PyTorch Tensor <-> Numpy

    • Tensor 转 Numpy:

      import torch

      tensor_image = torch.rand(3224224)  # 假设形状为 (C, H, W)
      numpy_image = tensor_image.permute(120).numpy()  # 转为 (H, W, C)
    • Numpy 转 Tensor:

      import numpy as np

      numpy_image = np.random.rand(2242243)  # 假设形状为 (H, W, C)
      tensor_image = torch.from_numpy(numpy_image).permute(201)  # 转为 (C, H, W)

    2.2. Numpy <-> OpenCV

    • Numpy 转 OpenCV(不需要额外处理):Numpy 格式和 OpenCV 格式本质相同,只需要确认通道顺序为 BGR。

      numpy_image = np.random.rand(2242243)  # 假设为 RGB 格式
      opencv_image = numpy_image[..., ::-1]  # 转为 BGR 格式
    • OpenCV 转 Numpy:

      opencv_image = np.random.rand(2242243)  # 假设为 BGR 格式
      numpy_image = opencv_image[..., ::-1]  # 转为 RGB 格式

    2.3. PIL <-> Numpy

    • PIL 转 Numpy:

      from PIL import Image
      import numpy as np

      pil_image = Image.open('example.jpg')  # 打开图像
      numpy_image = np.array(pil_image)  # 直接转换为 Numpy 数组
    • Numpy 转 PIL:

      numpy_image = np.random.randint(0255, (2242243), dtype=np.uint8)  # 假设为 RGB 格式
      pil_image = Image.fromarray(numpy_image)

    2.4. OpenCV <-> PIL

    • OpenCV 转 PIL:

      from PIL import Image
      import cv2

      opencv_image = cv2.imread('example.jpg')  # BGR 格式
      rgb_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB)  # 转为 RGB 格式
      pil_image = Image.fromarray(rgb_image)
    • PIL 转 OpenCV:

      pil_image = Image.open('example.jpg')  # PIL 格式
      numpy_image = np.array(pil_image)  # 转为 Numpy 格式
      opencv_image = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)  # 转为 BGR 格式

    2.5. PyTorch Tensor <-> PIL

    • Tensor 转 PIL:

      from torchvision.transforms import ToPILImage

      tensor_image = torch.rand(3224224)  # (C, H, W)
      pil_image = ToPILImage()(tensor_image)
    • PIL 转 Tensor:

      from torchvision.transforms import ToTensor

      pil_image = Image.open('example.jpg')
      tensor_image = ToTensor()(pil_image)  # 转为 (C, H, W)

    2.6. PyTorch Tensor <-> OpenCV

    • Tensor 转 OpenCV:

      import torch
      import numpy as np
      import cv2

      tensor_image = torch.rand(3224224)  # (C, H, W)
      numpy_image = tensor_image.permute(120).numpy()  # 转为 (H, W, C)
      opencv_image = cv2.cvtColor((numpy_image * 255).astype(np.uint8), cv2.COLOR_RGB2BGR)
    • OpenCV 转 Tensor:

      opencv_image = cv2.imread('example.jpg')  # BGR 格式
      rgb_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB)
      tensor_image = torch.from_numpy(rgb_image).permute(201) / 255.0  # 转为 (C, H, W)

    模型部署基础

    【一】什么是AIGC模型的Model-Offloading策略?

    AIGC(AI Generated Content)模型的 Model Offloading 策略主要是为了优化资源利用率,尤其是在计算资源(如 GPU 显存)有限的情况下,通过分阶段或分模块地加载和卸载模型的部分参数,以平衡性能和硬件限制。Rocky下面将详细讲解 Model Offloading 的策略及其在 AIGC 模型中的应用。

    1. Model Offloading 的背景和目的

    背景

    • AIGC 模型(如 GPT、Stable Diffusion、DALL-E 等)往往参数规模巨大(数十亿到数千亿),需要大量的显存(VRAM)和计算资源。
    • 在资源受限的设备上(如单 GPU 或多任务场景),显存可能不足以一次性加载整个模型。

    目的

    • 减少显存占用:通过动态加载模型的部分权重,将不需要的部分卸载到 CPU 或磁盘,减少 GPU 显存压力。
    • 支持大模型推理:即便硬件资源不足,也能通过优化数据流完成大模型的推理和训练。
    • 性能优化:在保证推理速度的情况下,合理分配硬件资源以提高利用率。

    2. Model Offloading 的核心策略

    Model Offloading 的策略可以大致分为以下几类:

    2.1. 分阶段加载与卸载(Layer-by-Layer Offloading)

    • 方法
      • 在推理过程中,仅将当前需要计算的模型层加载到 GPU 中。
      • 计算完成后,立即将这部分权重卸载到 CPU 或磁盘,释放 GPU 显存。
      • 对于下一层的计算,重复上述过程。
    • 优点
      • 显存使用峰值仅与单层计算的资源需求相关。
      • 对计算顺序较强的模型(如 Transformer)特别有效。
    • 缺点
      • CPU/GPU 之间频繁的数据传输可能成为瓶颈。

    2.2. 静态分配(Static Partitioning Offloading)

    • 方法
      • 经常使用的权重存储在 GPU 中。
      • 不常用的权重(如首尾层或低频模块)存储在 CPU 或磁盘中。
      • 根据硬件配置,将模型权重按固定规则分配到 CPU 和 GPU。例如:
    • 优点
      • 减少频繁的数据传输,适合推理任务。
    • 缺点
      • 对训练不友好,因为训练阶段需要频繁访问所有权重。

    2.3. 动态迁移(Dynamic Offloading)

    • 方法
      • 根据当前的硬件利用率、任务需求或显存状态,动态决定哪些模块需要迁移到 GPU 或 CPU。
      • 结合运行时监控工具(如 NVIDIA's PyTorch Profiler)优化决策。
    • 优点
      • 更智能,适应性强,可以根据任务负载动态调整。
    • 缺点
      • 实现复杂度高,性能不确定性较大。

    2.4. 磁盘缓存 Offloading

    • 方法
      • 将极少使用的模型权重存储在磁盘中,仅在需要时加载到内存。
      • 通过异步预加载机制减少磁盘 I/O 的延迟。
    • 优点
      • 最大限度减少对内存和显存的需求。
    • 缺点
      • 磁盘 I/O 延迟较大,可能严重影响推理性能。

    3. 具体实现与优化技术

    3.1. 在推理中的应用

    在推理阶段,模型通常是冻结的(不更新权重),可以采用以下策略:

    1. 权重分块

    • 将模型分为多个小模块(如 Transformer 的每一层)。
    • 每次仅加载一个模块进行计算。
  • 分布式推理

    • 使用多个设备分担权重存储和计算负载。
    • 示例:在 GPU1 上运行模型的前几层,GPU2 上运行后几层。
  • 流水线并行

    • 将模型切分为多个部分,每部分运行在不同设备上,同时处理不同批次的数据。

    3.2. 在训练中的应用

    训练阶段需要额外存储优化器状态和梯度值,Offloading 的实现更加复杂:

    1. 参数 Offloading

    • 使用 Offloading 将模型的部分参数放在 CPU,按需加载到 GPU。
    • 示例:DeepSpeed 的 ZeRO Stage 3。
  • 梯度和激活值 Offloading

    • 在反向传播中,将中间激活值存储到 CPU,减少 GPU 显存占用。
    • 用于梯度累积和计算时再加载回 GPU。
  • 分布式存储

    • 使用 NVMe 存储快速保存和加载权重。

    4. AIGC 模型中常用的 Model Offloading 案例

    4.1. GPT 模型

    • 策略
      • 将冷门权重(如 Embedding 层)放置在 CPU。
      • 对 Transformer 层按需加载。
      • 使用流水线并行处理。

    4.2. Stable Diffusion

    • 策略
      • UNet 和 VAE 的权重按层级分块,仅加载当前需要计算的部分。
      • 使用 torch.cuda.amp 进行混合精度计算。
      • 在内存不足时,将生成的中间特征图存储在 CPU。

    5. 优化 Offloading 的性能

    5.1. 减少传输延迟

    • 使用高带宽设备(如 NVLink 或 PCIe 4.0)连接 CPU 和 GPU。
    • 优化 CPU 和 GPU 之间的数据预取。

    5.2. 使用混合精度

    • 将模型部分权重(如 FP32)转换为 FP16 或 BF16,以减少存储需求和传输开销。

    5.3. 异步加载

    • 通过异步 I/O,在 GPU 空闲时预加载下一步所需的权重。

    5.4. 合理规划模型分割

    • 分割模型时,尽量将高计算密度部分优先加载到 GPU,以最大化利用率。

    【二】介绍一下NF4精度的特点

    NF4(Normalized Float 4-bit)是一种专门为深度学习模型设计的 4 位浮点数(4-bit floating-point)数值表示方式,旨在优化模型的存储和计算效率,同时尽量保持高精度。NF4 是目前低精度量化领域中的一种新兴方法,被广泛应用于大语言模型(LLMs)等参数量巨大的模型中。NF4精度具备以下优势:

    • 存储高效:仅占用 4-bit,适合大规模模型。
    • 性能稳定:在压缩显存占用的同时,精度损失较小。
    • 硬件友好:针对推理和部署场景进行优化。

    它是当前大模型量化的重要方向之一,结合工具(如 BitsAndBytes、DeepSpeed)和框架支持,可以大幅提升 AIGC 模型的运行效率。

    1. 背景与动机

    1.1 为什么需要 NF4?

    • 参数规模的快速增长:AIGC大模型(如 GPT-4、Stable Diffusion 等)往往包含数百亿到数万亿参数,导致显存需求巨大。
    • 存储和计算的瓶颈:传统的浮点表示(如 FP32、FP16)占用的存储空间较大,限制了硬件资源的利用率和训练规模。
    • 低精度量化的潜力:研究表明,模型参数的分布存在冗余信息,可以通过低精度量化(如 INT8、4-bit)显著压缩存储需求,同时保持模型性能。

    1.2 NF4 的特点

    • 提供一种更加高效的表示方式,通过归一化的 4-bit 浮点格式,实现压缩存储和加速计算。
    • 保留了浮点数的非线性分布特点(与 INT4 不同),更适合AIGC大模型中参数的动态范围。

    2. NF4 精度的定义

    NF4 是一种 4 位浮点数格式,其核心特性包括:

    1. 归一化值范围

    • NF4 的表示范围被归一化到一个动态区间,通常是通过归一化向量或权重块实现的。
    • 对每组参数(例如一层权重矩阵)进行归一化,使参数值映射到 NF4 格式支持的动态范围内。
  • 非线性量化

    • NF4 使用浮点表示方式的非线性分布,更适合参数中存在大值和小值的场景。
    • 不同于线性量化(如 INT4),NF4 能较好地保留数值动态范围内的梯度信息。
  • 4 位表示的压缩效果

    • 4 位表示将每个参数从 32-bit 或 16-bit 压缩到 4-bit,存储需求减少 8 倍或 4 倍。
    • 在大型模型(如数百亿参数)中,这种压缩效果显著减少显存需求。

    3. NF4 的工作原理

    3.1. 参数归一化

    • 在模型量化时,将每一组参数向量(或矩阵)进行归一化,使它们的数值分布在一个统一的范围内。例如:

      • :参数向量的归一化因子(如 L2 范数)。
      • :归一化后数值的动态范围。
    • 归一化的目的是确保所有参数在 NF4 表示范围内分布均匀,减少精度损失。

    3.2. 4-bit 浮点表示

    • NF4 的 4-bit 格式设计为:
      • 1 位符号位(S):表示正数或负数。
      • 3 位指数位(E):用于表示浮点数的动态范围,支持非线性表示。
    • 这种设计使 NF4 能在 4 位的限制下,覆盖较大的动态范围,同时保留一定的数值精度。

    3.3. 恢复过程

    • 在推理或训练中,从 NF4 格式解码回浮点数时,需要恢复归一化因子:

      • :在量化时保存的归一化因子,用于恢复 NF4 数据。

    4. NF4 的优点

    4.1. 更好的数值表示

    • 相比 INT4
      • INT4 是线性量化,不适合深度学习模型中权重和激活值的非线性分布。
      • NF4 的浮点表示能够捕捉权重的动态范围。
    • 相比 FP16 和 BF16
      • NF4 的存储成本更低,仅 4-bit,而 FP16 和 BF16 为 16-bit。

    4.2. 极大减少显存占用

    • NF4 将存储需求降低至原来的 1/8(相比 FP32)或 1/4(相比 FP16)。
    • 特别适合大模型的推理和部署场景。

    4.3. 推理性能与精度的平衡

    • NF4 在显著压缩存储需求的同时,能保持较高的模型推理性能,精度损失相较于 INT4 更小。

    5. NF4 的应用场景

    5.1. 大语言模型(LLMs)

    • 应用于 ChatGPT、GPT-4、PaLM 等大规模 Transformer 模型:
      • 在推理阶段通过 NF4 减少显存占用,使得在单 GPU 上运行超大模型成为可能。
      • 结合 Low-Rank Adaptation(LoRA)等技术,支持 4-bit 微调。

    5.2. AIGC 模型

    • 适用于生成类模型(如 DALL-E、Stable Diffusion):
      • 减少显存和内存占用,便于在消费级设备上运行。

    5.3. 推理和部署优化

    • 在边缘设备或资源有限的环境中,用 NF4 压缩模型权重,优化推理性能。

    6. NF4 的局限性

    6.1. 精度损失

    • 在极端条件下(如高精度依赖的任务),NF4 可能导致一定的性能下降。

    6.2. 实现复杂性

    • 需要额外的归一化处理,并在推理时恢复归一化因子。
    • 低精度计算对硬件支持要求较高。

    计算机基础

    Rocky从工业界、学术界、竞赛界以及应用界角度出发,总结归纳AI行业所需的计算机基础干货知识。这些干货知识不仅能在面试中帮助我们,还能让我们在AI行业中提高工作效率

    【一】计算机中两个AI服务,一个AI服务调用另外一个AI服务时,该如何设置两者ip地址和端口号?

    在AIGC、传统深度学习以及自动驾驶领域,进行AI服务的互相调用与支持,是非常常见的一种AI算法服务构建形式。

    在计算机中运行两个 AI 服务,并使用一个服务调用另一个服务,设置 IP 地址和端口号的方式取决于服务的运行环境和通信模式。

    我们需要根据AI业务的实际情况,进行灵活的IP 地址和端口号设置,来增强AI服务的鲁棒性与稳定性,特别是在网络存在波动的情况下。

    1. 场景假设

    • 服务 A:被调用的服务(提供 API 或接口)。
    • 服务 B:调用服务 A 的服务。

    2. 设置 IP 地址和端口号

    2.1 确定通信方式

    • 本地通信(单机部署)
      • 服务 A 和服务 B 在同一台计算机上运行。
      • 可使用 localhost(或 127.0.0.1)作为 IP 地址。
    • 跨网络通信(多机部署)
      • 服务 A 和服务 B 分别运行在不同的计算机上。
      • 服务 A 需要绑定其计算机的实际 IP 地址(如局域网 IP 192.168.x.x 或公网 IP)。

    2.2 服务 A 的配置

    • 绑定 IP 和端口
      • 如果服务 A 是一个 Web 服务(如 Flask、FastAPI、Django),在启动时需要设置 hostport 参数。
      • 示例(以 Flask 为例):
        from flask import Flask

        app = Flask(__name__)

        @app.route('/')
        def home():
            return "Hello from Service A!"

        if __name__ == '__main__':
            # 绑定到 0.0.0.0,监听所有网络接口,端口为 5000
            app.run(host='0.0.0.0', port=5000)
      • 这里设置的 host='0.0.0.0' 意味着服务 A 可被其他设备访问(本地或远程)。端口号设置为 5000

    2.3 服务 B 的配置

    • 调用服务 A
      • 本地通信:服务 A 的地址为 http://127.0.0.1:5000http://localhost:5000
      • 跨网络通信:服务 A 的地址为 http://<服务A的实际IP>:5000(如 http://192.168.1.100:5000)。
      • 服务 B 调用服务 A 的 API 时,需要知道服务 A 的 IP 和端口。

      • 根据通信方式:

      • 示例(服务 B 使用 Python 调用服务 A 的 API):

        import requests

        # 服务 A 的地址
        SERVICE_A_URL = "http://127.0.0.1:5000"

        def call_service_a():
            try:
                response = requests.get(SERVICE_A_URL)
                print("Response from Service A:", response.text)
            except Exception as e:
                print("Failed to call Service A:", e)

        if __name__ == '__main__':
            call_service_a()

    2.4 确保网络配置无冲突

    • 如果两个服务运行在同一台计算机上:

      • 确保每个服务绑定的端口号不同(例如,服务 A 使用 5000,服务 B 使用 6000)。
      • 示例启动服务 B:
        app.run(host='0.0.0.0', port=6000)
    • 如果两个服务运行在不同计算机上:

      • 服务 A 和服务 B 的端口号可以相同,但绑定的 IP 地址需要分别对应各自所在的计算机。
      • 确保服务 A 所在计算机的防火墙或网络配置允许服务 B 访问。

    3. 示例:完整的本地通信配置

    服务 A:提供 API

    from flask import Flask, jsonify

    app = Flask(__name__)

    @app.route('/api', methods=['GET'])
    def api():
        return jsonify({"message""Hello from Service A!"})

    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=5000)

    服务 B:调用服务 A

    import requests

    SERVICE_A_URL = "http://127.0.0.1:5000/api"

    def call_service_a():
        response = requests.get(SERVICE_A_URL)
        print("Response from Service A:", response.json())

    if __name__ == '__main__':
        call_service_a()
    • 启动服务 A 后,运行服务 B。
    • 服务 B 会通过 http://127.0.0.1:5000/api 调用服务 A。

    5. 跨网络通信配置示例

    服务 A:绑定到局域网 IP

    app.run(host='192.168.1.100', port=5000)

    服务 B:调用局域网的服务 A

    SERVICE_A_URL = "http://192.168.1.100:5000/api"
    • 确保两台计算机在同一个局域网,服务 B 可以通过 192.168.1.100 访问服务 A。

    【二】介绍一下计算机中DNS(Domain-Name-System)的概念

    DNS(Domain Name System,域名系统)是互联网中的一项基础技术,其作用是将易读的域名(如 www.WeThinkIn.com)转换为计算机可以识别的 IP 地址(如 192.168.1.12606:2800:220:1:248:1893:25c8:1946),以便用户能够进行网站访问、邮件服务和其他网络通信等功能。它具有分布式设计、缓存机制和容错性,同时也面临安全和隐私挑战。通过合理配置和使用 DNS 技术,在AIGC、传统深度学习以及自动驾驶领域都非常重要,可以提高AI网络服务的可靠性和性能。

    1. DNS 的作用

    在计算机网络中,主机之间通过 IP 地址通信。然而,IP 地址(尤其是 IPv6 地址)不易记忆,因此 DNS 提供了以下功能:

    1. 域名到 IP 地址的映射:解析用户输入的域名为对应的 IP 地址。
    2. IP 地址到域名的映射:支持反向解析,将 IP 地址解析为域名。
    3. 分布式的名称管理:通过层次化的系统分布管理域名,提供高效、可靠的域名解析服务。

    例如:

    • 用户访问 https://www.WeThinkIn.com,DNS 将其解析为 142.250.72.36
    • 浏览器使用这个 IP 地址建立连接,并加载网页内容。

    2. DNS 的层次结构

    DNS 采用分层的树状结构,由多个域组成,每个域由点号(.)分隔:

    1. 根域(Root Domain)

    • 是 DNS 层次结构的顶层,表示为一个隐式的点号(.)。
    • 例如:www.WeThinkIn.com. 实际包含根域的点号。
    • 根域由 13 组根服务器(Root Servers)管理,负责引导域名解析。
  • 顶级域(Top-Level Domain, TLD)

    • 通用顶级域:.com, .org, .net, .edu
    • 国家/地区代码顶级域:.cn, .uk, .us
    • 位于根域下方,例如:
    • TLD 由 ICANN(互联网名称与数字地址分配机构)授权的机构管理。
  • 二级域(Second-Level Domain, SLD)

    • TLD 之下的域名,例如 WeThinkIn.com 中的 WeThinkIn 是二级域。
    • 这些域名通常由企业或个人注册。
  • 子域(Subdomain)

    • 二级域名下可以划分子域,例如 www.WeThinkIn.com 中的 www 是子域。
    • 子域可以有多层级,例如 mail.server.WeThinkIn.com

    3. DNS 的工作原理

    3.1 域名解析过程

    当用户在浏览器中输入域名(如 www.WeThinkIn.com),系统通过 DNS 将其解析为 IP 地址,具体步骤如下:

    1. 本地缓存查询

    • 系统先查询本地 DNS 缓存,看是否已经解析过该域名。如果缓存命中,直接返回结果。
    • 否则,进入下一步。
  • 本地 DNS 服务器查询

    • 本地 DNS 服务器(通常由 ISP 提供)接收到解析请求。如果有结果,会返回。
    • 如果本地 DNS 服务器未命中,则向更高层的 DNS 服务器发起查询。
  • 递归查询

    • 本地 DNS 服务器向根域服务器发起请求,根域服务器返回对应顶级域(如 .com)的权威服务器地址。
    • 本地 DNS 服务器继续向顶级域权威服务器发起请求,获取二级域的权威服务器地址。
    • 依次类推,直到返回目标域名的 IP 地址。
  • 返回结果

    • 本地 DNS 服务器将最终结果返回给用户设备,并缓存结果以便后续快速查询。

    3.2 查询方式

    DNS 查询有两种主要方式:

    1. 递归查询

    • 查询由本地 DNS 服务器完成,用户只需等待最终结果。
    • 本地 DNS 服务器依次查询根服务器、TLD 服务器等,直到获取目标 IP。
  • 迭代查询

    • 用户设备接收到中间服务器的地址后,自行向这些服务器发起进一步查询。
    • 这种方式较少使用,大多数情况下由本地 DNS 服务器负责递归查询。

    4. DNS 的记录类型

    DNS 系统中,每个域名包含多个记录类型,不同类型提供不同的信息:

    记录类型描述
    A 记录将域名映射到 IPv4 地址。
    AAAA 记录将域名映射到 IPv6 地址。
    CNAME 记录将一个域名映射到另一个域名,常用于别名解析。
    MX 记录定义邮件服务器地址,用于电子邮件系统。
    NS 记录定义域名服务器的地址,指向该域名的权威 DNS 服务器。
    PTR 记录用于反向解析,将 IP 地址映射回域名。
    TXT 记录存储任意文本信息,常用于身份验证(如 SPF、DKIM)。
    SRV 记录服务定位记录,用于指定特定服务的地址(如 SIP、XMPP)。

    5. DNS 的技术特点

    5.1 分布式设计

    • DNS 采用分布式架构,整个系统由多个域名服务器组成,避免了单点故障。
    • 每个域名服务器只负责管理其所属域的记录。

    5.2 缓存机制

    • DNS 服务器和客户端都会缓存解析结果,以减少重复查询,提高解析效率。
    • 缓存的生存时间由记录中的 TTL(Time To Live)值决定。

    5.3 容错和冗余

    • 域名可以配置多个 DNS 服务器(主/备服务器),提高系统的可靠性。
    • 根服务器有 13 组,每组使用 Anycast 技术,分布在全球多个节点,确保高可用性。

    6. 常见 DNS 工具和命令

    1. **nslookup**:查询 DNS 记录。

      nslookup www.WeThinkIn.com
    2. **dig**:详细查询 DNS 信息。

      dig www.WeThinkIn.com
    3. **ping**:验证域名解析是否正常。

      ping www.WeThinkIn.com
    4. **host**:快速查询 DNS 记录。

      host www.WeThinkIn.com

    7. DNS 的应用场景

    1. 互联网访问:为用户提供人类可读的域名,方便访问网站。
    2. 负载均衡:通过多 A 记录或 CNAME 指向不同的服务器,分散流量。
    3. 邮件服务:通过 MX 记录指定邮件服务器地址。
    4. 内容分发网络(CDN):结合地理位置优化用户请求的分配。

    8. DNS 的挑战与解决方案

    1. DNS 缓存中毒

    • 攻击者伪造 DNS 响应,将用户引导到恶意网站。
    • 解决:启用 DNSSEC(DNS Security Extensions),验证响应的真实性。
  • 隐私问题

    • DNS 查询通常是明文传输,可能泄露用户访问记录。
    • 解决:使用 DoH(DNS over HTTPS)或 DoT(DNS over TLS)加密查询。
  • 高延迟

    • 多次查询可能导致解析延迟。
    • 解决:使用 DNS 缓存和本地 DNS 服务优化性能。

    开放性问题

    Rocky从工业界、学术界、竞赛界以及应用界角度出发,思考总结AI行业的干货开放性问题,这些问题不仅能够用于面试官的提问,也可以用作面试者的提问,在面试的最后阶段让面试双方进入深度的探讨与交流。

    与此同时,这些开放性问题也是贯穿我们职业生涯的本质问题,需要我们持续的思考感悟。这些问题没有标准答案,Rocky相信大家心中都有自己对于AI行业的认知与判断,欢迎大家在留言区分享与评论。

    【一】AI算法工程师如何以AI技术为核心,向外扩展更多基本面能力?

    Rocky认为这是AI算法工程师要终身思考的本质问题,以AI技术为核心,我们同样还需要扩展学习资源整合能力、沟通协调能力、销售能力、商务能力、产品能力、运维能力等。

    【二】如何对AI业务的本质价值进行挖掘与总结?

    Rocky认为这是AI行业的一个本质议题,需要我们持续对AI业务进行挖掘与思考,尤其是在AIGC时代这个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” 进行取用。

    WeThinkIn
    Rocky相信人工智能,数据科学,商业逻辑,金融工具,终身成长,以及顺应时代的潮流会赋予我们超能力。
     最新文章