Flink External Resource Framework让作业“原生”申请 GPU/FPGA 等外部资源

1. 外部资源框架到底做了什么

整体就两件事:

1)改写资源请求(Resource Request)

  • 你在 Flink 配置里声明要什么资源、要多少
  • Flink 会把这些外部资源需求映射进底层资源管理系统(Kubernetes/YARN)的容器或 Pod 资源请求中
  • 最终确保 TaskManager 所在的容器/Pod 真的带着你要的外部资源启动

2)把“可用资源信息”提供给算子(Operator)

  • TaskManager 启动后,由“外部资源驱动(driver)”生成 ExternalResourceInfo(资源信息集合)
  • 算子通过 RuntimeContext.getExternalResourceInfos(resourceName) 拿到资源的关键属性(比如 GPU index),然后就可以在算子里绑定对应设备去用

一句话:框架负责“申请 + 告知”,至于“怎么用”取决于具体插件。

2. 适用场景与边界

适合的典型场景

  • GPU 推理(TensorRT / ONNX Runtime / PyTorch inference)作为 RichFunction/AsyncFunction 的一部分
  • GPU 加速特征工程或向量计算
  • 需要 FPGA、专用加速卡的自定义计算
  • 同一套作业在 Kubernetes/YARN 上希望“按需申请资源”

当前边界(很关键)

  • 外部资源是“机器级/进程级共享”的:同一 TaskManager 上运行的所有算子拿到的 ExternalResourceInfos 目前是同一份集合
  • 也就是说:没有 operator 级别的资源隔离(同 TM 内算子理论上能看到同一批 GPU)

如果你希望“每个算子/每个 subtask 独占一张卡”,需要你在算子内部做更严格的绑定策略,或用脚本协调模式避免同机多 TM 抢同一 GPU(后面讲)。

3. 启用流程:三步走

3.1 准备外部资源插件(plugins/)

外部资源通过 Flink 插件机制加载,你需要把对应 jar 放到 Flink 的 plugins/ 目录下的某个子目录中,例如:

  • GPU 插件:放到 plugins/external-resource-gpu/(或你自定义目录,但要保证 jar 能被加载)
  • 自定义资源插件:创建一个目录,比如 plugins/fpga/,把你打出来的 jar 放进去

插件隔离非常重要:每个 plugin 目录是独立 classloader,避免依赖冲突;同时 SPI(ServiceLoader)文件必须保留(META-INF/services)。

3.2 配置 external-resources 与每个资源的参数

核心配置有两层:

A)先声明启用哪些资源(白名单)

external-resources: gpu;fpga 

只有这里列出来的 <resource_name> 才会生效。

B)为每个资源配置 amount、k8s/yarn 映射、driver、driver 参数
常见配置项含义:

  • external-resource.<name>.amount:每个 TaskManager 需要的资源数量
  • external-resource.<name>.yarn.config-key:YARN 容器资源 profile 的映射 key(可选)
  • external-resource.<name>.kubernetes.config-key:K8s 容器 resources.requests/limits 的 key(可选)
  • external-resource.<name>.driver-factory.class:驱动工厂(可选但强烈建议)
    • 不配置也能“申请到资源”,但算子拿不到 ExternalResourceInfo(RuntimeContext 里会没有信息)
  • external-resource.<name>.param.<param>:传给驱动工厂的自定义参数(插件自定义解释)

一个包含 GPU+FPGA 的示例:

external-resources: gpu;fpga external-resource.gpu.driver-factory.class: org.apache.flink.externalresource.gpu.GPUDriverFactory external-resource.gpu.amount:2external-resource.gpu.param.discovery-script.args:--enable-coordination-mode external-resource.fpga.driver-factory.class: org.apache.flink.externalresource.fpga.FPGADriverFactory external-resource.fpga.amount:1external-resource.fpga.yarn.config-key: yarn.io/fpga 

3.3 在算子里使用 RuntimeContext 获取资源信息

算子侧用法非常直接:

publicclassExternalResourceMapFunctionextendsRichMapFunction<String,String>{privatestaticfinalString RESOURCE_NAME ="gpu";@OverridepublicStringmap(String value)throwsException{Set<ExternalResourceInfo> infos =getRuntimeContext().getExternalResourceInfos(RESOURCE_NAME);List<String> indices =newArrayList<>();for(ExternalResourceInfo info : infos){ info.getProperty("index").ifPresent(indices::add);// GPU 插件常用属性 key:index}// 这里用 indices 做设备绑定,比如选择一张卡 set CUDA_VISIBLE_DEVICES 或初始化推理引擎return value;}}

每个 ExternalResourceInfo 里有哪些 key,取决于插件实现。你可以用 ExternalResourceInfo#getKeys() 获取完整键集合。

4. Kubernetes / YARN / Standalone:三种环境的差异

4.1 Kubernetes

  • K8s 原生通过 Device Plugin 机制提供 GPU/FPGA 等资源(Kubernetes v1.10+ 支持)
  • Flink 会把你配置的 kubernetes.config-key 写入 TaskManager 主容器的:
    • resources.requests.<config-key>
    • resources.limits.<config-key>

GPU 的常见 key:

  • NVIDIA:nvidia.com/gpu
  • AMD:amd.com/gpu(但 Flink 默认 discovery 脚本是 NVIDIA 的,AMD 需要你自己写脚本)

4.2 YARN

  • YARN 2.10+ / 3.1+ 开始支持 GPU/FPGA 资源
  • Flink 通过 external-resource.<name>.yarn.config-key 把 amount 写进 container resource profile

GPU(YARN)常见 key:

  • yarn.io/gpu(注意:YARN 当前通常仅支持 NVIDIA GPU 的调度)

4.3 Standalone

  • Standalone 模式没有底层 RM 帮你“保证资源”,你需要管理员在节点上确保外部资源可用(驱动安装、权限、设备可见性等)
  • 如果同一台机器上跑多个 TaskManager,GPU 可见性很容易冲突,需要配合 discovery script 的协调模式

5. GPU 插件:最常用也最值得踩坑的一块

Flink 目前官方提供的一方外部资源插件就是 GPU 插件。

5.1 必要配置(GPU)

external-resources: gpu external-resource.gpu.driver-factory.class: org.apache.flink.externalresource.gpu.GPUDriverFactory external-resource.gpu.amount:2# Kubernetesexternal-resource.gpu.kubernetes.config-key: nvidia.com/gpu # YARNexternal-resource.gpu.yarn.config-key: yarn.io/gpu 

5.2 discovery script(GPU 发现脚本)

GPUDriver 会调用 discovery script 来发现可用 GPU,并生成 ExternalResourceInfo,其中关键属性是:

  • key = index(GPU 设备 index)

默认脚本路径(NVIDIA):

external-resource.gpu.param.discovery-script.path: plugins/external-resource-gpu/nvidia-gpu-discovery.sh 

自定义脚本路径(例如 AMD)也可以配置同一个 key。

脚本参数:

external-resource.gpu.param.discovery-script.args:--enable-coordination-mode 

5.3 脚本契约(你写自定义脚本时必须遵守)

  • Flink 先把 amount 作为第一个参数传给脚本
  • 你配置的 discovery-script.args 会拼在后面
  • 脚本输出:用逗号分隔的 GPU index 列表,例如 0,1
  • 输出里纯空白 index 会被忽略
  • 如果发现失败或数量不足:脚本返回非 0 exit code,Flink 将不会向算子提供 gpu 信息(RuntimeContext 拿不到)

5.4 协调模式:解决“同机多 TM 抢同一 GPU”

Standalone 下经常同机部署多个 TaskManager,此时所有 TM 默认都能看到同一批 GPU(nvidia-smi 可见),很容易“多进程抢同一张卡”。

默认脚本提供 coordination mode:

  • --enable-coordination-mode:启用协调
  • --coordination-file <path>:协调文件路径(默认 /var/tmp/flink-gpu-coordination

它能保证:同一个 Flink 集群内,同机多个 TaskManager 不会分到同一张 GPU。

但要注意两点:

  • 只在“同一协调文件范围内”有效:另一个 Flink 集群如果用不同 coordination file,仍可能抢同一 GPU
  • 非 Flink 应用也可能用同一 GPU,这个模式无法防住

6. 自定义资源插件:你要支持 FPGA/自研加速卡怎么做

你需要实现三件套:

1)ExternalResourceDriver

  • retrieveResourceInfo(long amount):返回 ExternalResourceInfo 集合(你定义的资源维度)

2)ExternalResourceDriverFactory

  • createExternalResourceDriver(Configuration config):从配置创建 driver

3)SPI 服务声明(非常关键)

  • 在 jar 内创建文件:
    • META-INF/services/org.apache.flink.api.common.externalresource.ExternalResourceDriverFactory
  • 文件内容写你的 factory 全类名,例如:
    • your.domain.FPGADriverFactory

示例骨架:

publicclassFPGADriverimplementsExternalResourceDriver{@OverridepublicSet<ExternalResourceInfo>retrieveResourceInfo(long amount){// 发现并返回 FPGA 信息集合returnSet.of(/* ... */);}}publicclassFPGADriverFactoryimplementsExternalResourceDriverFactory{@OverridepublicExternalResourceDrivercreateExternalResourceDriver(Configuration config){returnnewFPGADriver();}}publicclassFPGAInfoimplementsExternalResourceInfo{@OverridepublicOptional<String>getProperty(String key){// 根据 key 返回属性,比如 "device", "pci", "address" 等returnOptional.empty();}@OverridepublicCollection<String>getKeys(){returnList.of("device","pci","address");}}

打包成 jar 丢到 plugins/fpga/,然后在 flink-conf.yaml 里按 <resource_name> 配置启用即可。

7. 排障清单:最常见的 6 个“为什么拿不到 GPU”

1)external-resources 没写 gpu(或资源名拼错)
2)插件 jar 没放到 plugins/ 下正确目录(或目录里缺依赖)
3)没配置 driver-factory.class,导致算子侧拿不到 ExternalResourceInfo
4)K8s 没装 NVIDIA device plugin(Pod 根本拿不到 GPU)
5)discovery script 不可执行 / 路径不对 / 返回非 0
6)Standalone 同机多 TM 没开协调模式,导致资源冲突看似“有卡但不可用”

8. 最佳实践建议

  • 先明确“资源申请”和“资源绑定”是两步:申请解决“容器是否带卡”,绑定解决“算子用哪张卡”
  • GPU 推理算子里要做设备亲和:基于 index 决定 CUDA_VISIBLE_DEVICES 或引擎初始化参数
  • Standalone 同机多 TM 建议默认开 coordination mode
  • 生产上尽量用 Kubernetes/YARN 去做资源保证,Standalone 只适合可控环境
  • 由于没有 operator 级隔离,最好避免在同一 TM 内多个算子“各自随便挑卡”,要统一策略(例如只由一个算子管理 GPU worker)

Read more

04-Unity机床|机器人加工防碰撞仿真、代码说明

04-Unity机床|机器人加工防碰撞仿真、代码说明

写在前面 每隔一段时间打开这个数字孪生系统就忘记以前是怎么设置的了,所以决定写点什么记录一下,纯纯说明书。本文详细记录了数字孪生系统中机器人仿真功能的实现过程。主要内容包括:1)仿真文件加载路径和碰撞器设置;2)铣磨机、抛光机及机器人变量绑定方法;3)关节J5/J6遍历运动集功能,包含碰撞检测(标红显示)、轨迹绘制和数据导出;4)完整的C#代码实现,涵盖运动控制、碰撞检测逻辑和CSV数据记录功能。 一、操作步骤 1.仿真源代码 机床仿真代码来源于Vericut,ABB机器人仿真代码来源于Robotstudio,均可保存为.txt文件,图1-5分别为Unity仿真加载文件列表,铣磨机、抛光机和机器人仿真文件,机器人关节遍历代码,图2-4代码保存至unity项目固定文件夹【E:\unity\Unity Project\My project\Assets\StreamingAssets】下。 机器人仿真文件机器人关节遍历代码 2.Unity碰撞器 Unity碰撞器类型:盒碰撞器/2D

GDPR合规要求下使用Llama-Factory的注意事项

GDPR合规要求下使用Llama-Factory的注意事项 在企业加速拥抱生成式AI的今天,大语言模型(LLM)正以前所未有的速度渗透进客服系统、内容平台和智能助手等核心业务场景。然而,当模型训练变得越来越“平民化”,一个严峻的问题也随之浮现:我们是否在无意中将用户隐私暴露于风险之中?尤其是在欧盟《通用数据保护条例》(GDPR)这一全球最严格的数据法规之下,哪怕是一次看似无害的微调操作,也可能触发巨额罚款与品牌危机。 以开源工具 Llama-Factory 为例,它让非专业开发者也能轻松完成对 LLaMA、Qwen 等主流模型的指令微调。其直观的 WebUI 和一键式 LoRA 配置极大提升了效率——但正是这种“低门槛”特性,使得敏感数据被误用的风险显著上升。一旦训练数据中包含姓名、邮箱或对话记录,而未采取合规措施,就可能构成对 GDPR 的直接违反。 更棘手的是,传统意义上的“删除数据”在深度学习语境下并不奏效。即使你从数据库中清除了某位用户的资料,只要他曾参与过模型训练,他的信息影响仍可能残留在参数中,导致模型在特定提示下“复现”真实内容。这不仅违背了“

2026最火的6款免费AI写作软件测评:ai写网文哪个好用?这款ai消痕工具

2026最火的6款免费AI写作软件测评:ai写网文哪个好用?这款ai消痕工具

很多朋友想在业余时间写写番茄、起点网文或者搞搞短剧赚点外快,但总是卡在“憋不出字”或者“大纲写崩”上。现在都2026年了,用ai写作软件来辅助写小说早就不是秘密了。 但是,网文平台的审核越来越严,很多新手直接用AI生成的文章发出去,立马就被平台判定为“AI生成”导致限流,不仅没流量,连全勤奖都拿不到。 今天,我们就抛开那些晦涩难懂的技术术语,用大白话给大家实测目前市面上热度最高的6款免费ai写作平台。到底ai写网文哪家强?怎么解决让人头疼的“机器味”?这篇超详细的避坑指南,建议想靠文字搞钱的朋友直接收藏! 一、 6大热门免费AI小说工具优缺点大盘点 我们选了大家最常搜的几款工具,直接看它们在实际写小说、写剧本时的真实表现。 1. 豆包:起名和找灵感的“点子王” * 优点:速度飞快,完全免费。你如果卡文了,或者不知道主角叫什么、书名怎么起才能吸引人,直接问豆包,它能一秒钟给你吐出几十个极其符合抖音、小红书调性的网感标题和名字。 * 缺点:千万别让它直接给你写正文!它的AI味太重了,动不动就是“嘴角勾起一抹弧度”、“倒吸一口凉气”。把这种文发到小说平台,

技术报告:在 4x Tesla P40 上训练 Llama-3.3-70B 大模型指南

作者: Antigravity (Google DeepMind Agent) 日期: 2026-01-14 硬件目标: NVIDIA Tesla P40 (24GB) x4 模型目标: Llama-3.3-70B-Instruct 1. 摘要 本报告详细记录了在不支持 BFloat16 和 Tensor Cores 半精度加速(Pascal 架构)的老旧硬件(Tesla P40)上,成功训练 70B 参数量级大预言模型的技术方案。 通过结合 4-bit NF4 量化、模型自动分片 (Model Sharding) 以及 纯 FP32 训练管线 (Pure FP32 Pipeline),我们成功克服了硬件架构限制,实现了稳定训练。 2.