文章目录

    • PPO vs GRPO
    • PPO的目标函数
    • GRPO的目标函数
      • KL散度约束与估计
      • ORM监督RL的结果
      • PRM监督RL的过程
      • 迭代RL
      • 算法流程
    • GRPO损失的不同版本
    • GRPO源码解析

  • DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models

PPO vs GRPO

在这里插入图片描述

PPO的目标函数

J P P O ( θ ) = E [ q ∼ P ( Q ) , o ∼ π θ old  ( O ∣ q ) ] 1 ∣ o ∣ ∑ t = 1 ∣ o ∣ min ⁡ [ π θ ( o t ∣ q , o < t ) π θ old  ( o t ∣ q , o < t ) A t , clip ⁡ ( π θ ( o t ∣ q , o < t ) π θ old  ( o t ∣ q , o < t ) , 1 − ε , 1 + ε ) A t ] \begin{align*} \mathcal{J}_{P P O}(\theta) &=\mathbb{E}\left[q \sim P(Q), o \sim \pi_{\theta_{\text {old }}}(O \mid q)\right]\\ &\frac{1}{|o|}\sum_{t=1}^{|o|} \min \left[\frac{\pi_\theta\left(o_t \mid q, o_{<t}\right)}{\pi_{\theta_{\text {old }}}\left(o_t \mid q, o_{<t}\right)} A_t, \operatorname{clip}\left(\frac{\pi_\theta\left(o_t \mid q, o_{<t}\right)}{\pi_{\theta_{\text {old }}}\left(o_t \mid q, o_{<t}\right)}, 1-\varepsilon, 1+\varepsilon\right) A_t\right] \end{align*} JPPO(θ)=E[qP(Q),oπθold (Oq)]o1t=1omin[πθold (otq,o<t)πθ(otq,o<t)At,clip(πθold (otq,o<t)πθ(otq,o<t),1ε,1+ε)At]

A t A_t At是使用广义优势估计(GAE)基于奖励 { r ≥ t } \{r_{\ge t}\} {rt}和状态价值 V ψ V_{\psi} Vψ计算的优势值,属于Actor-Critic算法,需要联合训练策略模型和状态价值模型。通常在每一个token的奖励上添加策略模型和参考模型的KL惩罚,以避免奖励模型被过拟合而产生异常输出
r t = r φ ( q , o ≤ t ) − β log ⁡ π θ ( o t ∣ q , o < t ) π r e f ( o t ∣ q , o < t ) r_t=r_{\varphi}\left(q, o_{\leq t}\right)-\beta \log \frac{\pi_\theta\left(o_t \mid q, o_{<t}\right)}{\pi_{r e f}\left(o_t \mid q, o_{<t}\right)} rt=rφ(q,ot)βlogπref(otq,o<t)πθ(otq,o<t)

GRPO的目标函数

PPO算法使用价值模型输出作为优势的baseline,指导策略模型更新。价值模型一般与策略模型尺寸相当,训练时占显存、耗算力。在LLM生成场景下,奖励函数给出整个响应的分数,作为最后一个token的奖励,而价值模型要预测响应中所有token的奖励,比较难。

GRPO通过对单个query采样多个response,取平均奖励作为baseline不需要使用价值模型(foregoes critic model),目标函数为:

J G R P O ( θ ) = E [ q ∼ P ( Q ) , { o i } i = 1 G ∼ π θ o l d ( O ∣ q ) ] 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ { min ⁡ [ π θ ( o i , t ∣ q , o i , < t ) π θ o l d ( o i , t ∣ q , o i , < t ) A ^ i , t , clip ⁡ ( π θ ( o i , t ∣ q , o i , < t ) π θ o l d ( o i , t ∣ q , o i , < t ) , 1 − ε , 1 + ε ) A ^ i , t ] − β D K L [ π θ ∣ ∣ π r e f ] } \begin{align*} \mathcal{J}_{G R P O}(\theta) & =\mathbb{E}\left[q \sim P(Q),\left\{o_i\right\}_{i=1}^G \sim \pi_{\theta_{o l d}}(O \mid q)\right] \\ & \frac{1}{G} \sum_{i=1}^G \frac{1}{\left|o_i\right|} \sum_{t=1}^{\left|o_i\right|}\left\{\min \left[\frac{\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)}{\pi_{\theta_{o l d}}\left(o_{i, t} \mid q, o_{i,<t}\right)} \hat{A}_{i, t}, \operatorname{clip}\left(\frac{\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)}{\pi_{\theta_{o l d}}\left(o_{i, t} \mid q, o_{i,<t}\right)}, 1-\varepsilon, 1+\varepsilon\right) \hat{A}_{i, t}\right]-\beta \mathbb{D}_{K L}\left[\pi_\theta| | \pi_{r e f}\right]\right\} \end{align*} JGRPO(θ)=E[qP(Q),{oi}i=1Gπθold(Oq)]G1i=1Goi1t=1oi{min[πθold(oi,tq,oi,<t)πθ(oi,tq,oi,<t)A^i,t,clip(πθold(oi,tq,oi,<t)πθ(oi,tq,oi,<t),1ε,1+ε)A^i,t]βDKL[πθ∣∣πref]}

GRPO通过建立组内竞争机制,不需要外部独立的Critic。这使得比组内平均分高的响应获得正分数,低的获得负分数,鼓励模型生成比平均水平更好的响应,使得平均得分越来越高。

KL散度约束与估计

KL散度作为正则项,用于约束策略更新幅度,GRPO使用k3型的KL散度估计:
D K L [ π θ ∣ ∣ π r e f ] = π r e f ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − log ⁡ π r e f ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − 1 \mathbb{D}_{K L}\left[\pi_\theta| | \pi_{r e f}\right]=\frac{\pi_{r e f}\left(o_{i, t} \mid q, o_{i,<t}\right)}{\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)}-\log \frac{\pi_{r e f}\left(o_{i, t} \mid q, o_{i,<t}\right)}{\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)}-1 DKL[πθ∣∣πref]=πθ(oi,tq,oi,<t)πref(oi,tq,oi,<t)logπθ(oi,tq,oi,<t)πref(oi,tq,oi,<t)1

解释: 奖励模型基于比较/偏好数据集训练,使用相对优势的RL方法与奖励模型也比较匹配。PPO方法将策略模型和参考模型的KL散度作为奖励的惩罚,GRPO不惩罚奖励,而是将KL惩罚直接放在策略损失里面,避免在 A i , t A_{i,t} Ai,t中引入复杂的计算。

通常 x x x无法穷举,一般通过多次采样求平均方式估计期望,也就是无偏估计,KL散度的定义及无偏估计为
K L [ p ∣ ∣ q ] = ∑ x p ( x ) log ⁡ ( p ( x ) q ( x ) ) = E x ∼ p [ p ( x ) q ( x ) ] ≈ 1 N log ⁡ ( p ( x ) q ( x ) ) KL[p||q]=\sum_x p(x)\log\left(\dfrac{p(x)}{q(x)}\right)=\mathbb E_{x\sim p}\left[\frac{p(x)}{q(x)}\right]\approx\frac{1}{N}\log\left(\frac{p(x)}{q(x)}\right) KL[p∣∣q]=xp(x)log(q(x)p(x))=Exp[q(x)p(x)]N1log(q(x)p(x))

采样与期望: 如果p中有n个不同的x,从中随机采样m个x,m>>n,则重复x的个数除以m就近似为概率p(x)。

r = q ( x ) / p ( x ) r=q(x)/p(x) r=q(x)/p(x),几种不同的KL散度估计:

  • k1 − log ⁡ r -\log r logr无偏、高方差,半数样本为负(KL为正),偏差比较高。
  • k2 1 2 ( log ⁡ r ) 2 \dfrac{1}{2}(\log r)^2 21(logr)2有偏、低方差,始终为正,明确反映出分布之间的偏离程度。
  • k3 − log ⁡ r + ( r − 1 ) -\log r + (r - 1) logr+(r1)无偏、低方差,始终为正。启发式设计,k1加上期望为0,并且与其负相关的项。
    • p ( x ) p(x) p(x) q ( x ) q(x) q(x)分步接近时, r r r的期望为1,新增项 r − 1 r-1 r1为0;
    • r r r增大,k1 − log ⁡ ( r ) -\log(r) log(r)减小,新增项 ( r − 1 ) (r-1) (r1)增加;
    • 直观表达, l o g ( p / q ) + ( q / p − 1 ) log(p/q)+(q/p-1) log(p/q)+(q/p1) p ( x ) p(x) p(x)大于 q ( x ) q(x) q(x)时,k1大于0,新增修正项小于1;

ORM监督RL的结果

对于每个query q q q,从 π θ o l d \pi_{\theta_{old}} πθold中采样一组输出 G = { o 1 , o 2 , ⋯ , o G } G=\{o_1,o_2,\cdots,o_{G}\} G={o1,o2,,oG},奖励模型对这些输出(或者说结果Outcome)打分 r = { r 1 , r 2 , ⋯ , r G } {\bf r}=\{r_1,r_2,\cdots,r_{G}\} r={r1,r2,,rG},将这些奖励标准化可作为每个输出 o i o_i oi在结束位置的组内相对优势
A ^ i , t = r ~ i = r i − mean ⁡ ( r ) std ⁡ ( r ) \hat{A}_{i, t}=\widetilde{r}_i=\frac{r_i-\operatorname{mean}(\mathbf{r})}{\operatorname{std}(\mathbf{r})} A^i,t=r i=std(r)rimean(r)

PRM监督RL的过程

结果监督仅提供了每个输出在结束位置的奖励,不足以监督复杂的数学推理任务。为监督过程,对每个推理步骤打分:
R = { { r 1 i n d e x ( 1 ) , ⋯ , r 1 i n d e x ( K 1 ) } , ⋯ , { r G i n d e x ( 1 ) , ⋯ , r G i n d e x ( K G ) } } \mathbf{R}=\left\{\left\{r_1^{{index}(1)}, \cdots, r_1^{{index}\left(K_1\right)}\right\}, \cdots,\left\{r_G^{{index}(1)}, \cdots, r_G^{{index}\left(K_G\right)}\right\}\right\} R={{r1index(1),,r1index(K1)},,{rGindex(1),,rGindex(KG)}}

其中 i n d e x ( j ) index(j) index(j)表示第 j j j步的结束token,标准化的步骤奖励为
r ~ i i n d e x ( j ) = r i i n d e x ( j ) − mean ⁡ ( R ) std ⁡ ( R ) \tilde{r}_i^{{index}(j)}=\frac{r_i^{{index}(j)}-\operatorname{mean}(\mathbf{R})}{\operatorname{std}(\mathbf{R})} r~iindex(j)=std(R)riindex(j)mean(R)

每一个token的优势等于之后所有步骤的标准化奖励和:
A ^ i , t = ∑ i n d e x ( j ) ≥ t r ~ i i n d e x ( j ) \hat A_{i,t}=\sum_{index(j)\ge t}\tilde r_i^{index(j)} A^i,t=index(j)tr~iindex(j)

迭代RL

随着策略模型更新,奖励模型可能不足以监督策略模型。GRPO使用迭代的方式,从新的策略模型中采样数据,加上10%的历史数据,以继续训练方式更新奖励模型。之后,将最新的策略模型设置为参考模型,继续训练策略模型,重复上述过程。

算法流程

在这里插入图片描述

奖励模型使用base模型初始化,经由偏好数据训练而得。

GRPO损失的不同版本

GRPO目标可以定义为
L G R P O ( θ ) = − 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ l i , t , w . t . l i , t = π θ ( o i , t ∣ q , o i , < t ) [ π θ ( o i , t ∣ q , o i , < t ) ] n o g r a d A ^ i , t − β D K L [ π θ ∥ π r e f ] \mathcal{L}_{\mathrm{GRPO}}(\theta)=-\frac{1}{G} \sum_{i=1}^G \frac{1}{\left|o_i\right|} \sum_{t=1}^{\left|o_i\right|} l_{i, t}, \quad w.t.\ l_{i, t}=\frac{\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)}{\left[\pi_\theta\left(o_{i, t} \mid q, o_{i,<t}\right)\right]_{\mathrm{no} \mathrm{grad}}} \hat{A}_{i, t}-\beta \mathbb{D}_{\mathrm{KL}}\left[\pi_\theta \| \pi_{\mathrm{ref}}\right] LGRPO(θ)=G1i=1Goi1t=1oili,t,w.t. li,t=[πθ(oi,tq,oi,<t)]nogradπθ(oi,tq,oi,<t)A^i,tβDKL[πθπref]

DAPO指出,GRPO使用sample-level损失,在long-COT场景下,对long-response惩罚不足,导致其输出质量比较低。DAPO使用token-level损失,所有response中的每个token的奖励更加平衡,不受response长度的影响。
L D A P O ( θ ) = − 1 ∑ i = 1 G ∣ o i ∣ ∑ i = 1 G ∑ t = 1 ∣ o i ∣ l i , t \mathcal{L}_{\mathrm{DAPO}}(\theta)=-\frac{1}{\sum_{i=1}^G\left|o_i\right|} \sum_{i=1}^G \sum_{t=1}^{\left|o_i\right|} l_{i, t} LDAPO(θ)=i=1Goi1i=1Gt=1oili,t

Dr. GRPO指出,DAPO没有完全消除不同response长度偏差的影响,为了更彻底的消除,其使用常数替代序列长度:
L Dr. GRPO ( θ ) = − 1 L G ∑ i = 1 G ∑ t = 1 ∣ o i ∣ l i , t \mathcal{L}_{\text{Dr. GRPO}}(\theta) = -\frac{1}{LG} \sum_{i=1}^{G} \sum_{t=1}^{|o_i|} l_{i, t} LDr. GRPO(θ)=LG1i=1Gt=1oili,t

GRPO源码解析

代码库trl中GRPOTrainer的实现,继承于Transformers Trainer,重载_prepare_inputscompute_loss方法

源码在这里:https://github.com/huggingface/trl/blob/v0.18.1/trl/trainer/grpo_trainer.py

算法过程

  1. 构造批次输入prompts
    • 使用自定义的RepeatSampler采样批次,对同一prompt重复采样多次,并且能够跨进程同步分组;
    • 风格为generatechat_completions,执行左padding、左truncate;
  2. 采样completions_prepare_inputs中调用_generate_and_score_completions,参数为temperature=0.9top_p=1.0max_new_tokens=256
    • 若使用vllm server:
      • 权重同步:确保policy model和vllm model的参数同步;
      • 数据并行采样:主进程上gather其它进程上的prompts,为每个不重复的prompt生成num_generations个completions;
      • 广播分配:主进程上broadcast所有completions到其它进程,对应进程截取自己prompts对应的completions;
    • 若使用transformers标准的model.generate:
      • 独立生成每个prompt的completion,包含重复的prompt(同一prompt多次prefill),计算低效;
  3. 处理completion padding
    • 根据completion中EOS的位置计算completion长度,并mask首个EOS后的token,只保留有效的completion token;
    • mask所有没有EOS的completion,避免异常completion对loss影响过大(可选);
  4. 计算old_logprobs:若使用相同completion多次迭代优化,计算当前policy model的logprobs作为old_logprobs,用于后续epoch中计算概率比率;
  5. 计算scores:每个reward model/reward func计算每条prompt+completion的score并加权,得到每条sentence的score;
  6. 计算advantages:gather所有进程上的scores,分组标准化,即奖励 - 奖励均值 / 奖励标准差(可选)
  7. 计算loss
    • 计算policy model的logprobs;
    • 计算reference model的ref_logprobs;
    • 计算policy model和reference model之间在每个completion token的kl散度,使用k3无偏估计:kl=log(p/q)+(q/p-1),如果p和q都是对数概率,则kl=p-q+exp(q-p)-1,即kl损失
    • 使用logprobs和old_logprobs计算概率比率并裁剪,限制参数更新幅度(重要性采样,PPO算法的核心),利用裁剪后概率比率clamped_ratio、advantage和completion mask,计算每个token的策略损失
    • 损失加权求和:加权求和token-level的策略损失和kl损失,kl损失权重小,非主导;
    • 损失均值化:loss有多种求和/平均方式,bnpo loss不考虑每条样本的completion长度的影响,取所有token的平均loss。grpo_loss对每条completion依次在token-level、sample-level上求和平均,对长completion的惩罚不足;
    • 使用梯度下降更新policy model;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/82375.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/82375.shtml
英文地址,请注明出处:http://en.pswp.cn/web/82375.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux或者Windows下PHP版本查看方法总结

确定当前服务器或本地环境中 PHP 的版本,可以通过以下几种方法进行操作: 1. 通过命令行检查 这是最直接且常用的方法,适用于本地开发环境或有 SSH 访问权限的服务器。 方法一:php -v 命令 php -v输出示例:PHP 8.1.12 (cli) (built: Oct 12 2023 12:34:56) (NTS) Copyri…

[Linux] MySQL源码编译安装

目录 环境包安装 创建程序用户 解压源码包 配置cmake ​编辑编译 安装 配置修改属性 属主和属组替换成mysql用户管理 系统环境变量配置 初始化数据库 服务管理 启动 环境包安装 yum -y install ncurses ncurses-devel bison cmake gcc gcc-c 重点强调&#xff1a;采…

【C++项目】负载均衡在线OJ系统-1

文章目录 前言项目结果演示技术栈&#xff1a;结构与总体思路compiler编译功能-common/util.hpp 拼接编译临时文件-common/log.hpp 开放式日志-common/util.hpp 获取时间戳方法-秒级-common/util.hpp 文件是否存在-compile_server/compiler.hpp 编译功能编写&#xff08;重要&a…

转战海外 Web3 远程工作指南

目录 一、明确职业目标和技能 二、准备常用软件 &#xff08;一&#xff09;通讯聊天工具 &#xff08;二&#xff09;媒体类平台 &#xff08;三&#xff09;线上会议软件 &#xff08;四&#xff09;办公协作工具 &#xff08;五&#xff09;云存储工具 &#xff08;六…

MongoDB账号密码笔记

先连接数据库&#xff0c;新增用户密码 admin用户密码 use admin db.createUser({ user: "admin", pwd: "yourStrongPassword", roles: [ { role: "root", db: "admin" } ] })用户数据库用户密码 use myappdb db.createUser({ user: &…

CSS强制div单行显示不换行

在CSS中&#xff0c;要让<div>的内容强制单行显示且不换行&#xff0c;可通过以下属性组合实现&#xff1a; 核心解决方案&#xff1a; css 复制 下载 div {white-space: nowrap; /* 禁止文本换行 */overflow: hidden; /* 隐藏溢出内容 */text-overflow: e…

RK3568-快速部署codesys runtime

前期准备 PC-win10系统 RK3568-debian系统,内核已打入实时补丁,开启ssh服务。PC下载安装CODESYS Development System V3.5.17.0 https://store.codesys.com/en/codesys.html#product.attributes.wrapperPC下载安装 CODESYS Control for Linux ARM64 SL 4.1.0.0.package ht…

中英混合编码解码全解析

qwen模型分词器怎么映射的:中英混合编码解码全解析 中英文混合编码与解码的过程,本质是 字符编码标准(如 UTF-8)对多语言字符的统一处理 ,核心逻辑围绕“字节序列 ↔ 字符映射”展开 北京智源人工智能研究院中文tokenID qwen模型分词器文件 一、编码阶段:统一转为字节序…

React 事件处理与合成事件机制揭秘

引言 在现代前端开发的技术生态中&#xff0c;React凭借其高效的组件化设计和声明式编程范式&#xff0c;已成为构建交互式用户界面的首选框架之一。除了虚拟DOM和单向数据流等核心概念&#xff0c;React的事件处理系统也是其成功的关键因素。 这套系统通过"合成事件&qu…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

android 媒体框架之MediaCodec

一、MediaCodec 整体架构与设计思想 MediaCodec 是 Android 底层多媒体框架的核心组件&#xff0c;负责高效处理音视频编解码任务。其架构采用 生产者-消费者模型&#xff0c;通过双缓冲区队列&#xff08;输入/输出&#xff09;实现异步数据处理&#xff1a; 输入缓冲区队列…

Starrocks Full GC日志分析

GC日志样例&#xff1a; [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

React从基础入门到高级实战:React 高级主题 - React 微前端实践:构建可扩展的大型应用

React 微前端实践&#xff1a;构建可扩展的大型应用 引言 在2025年的技术生态中&#xff0c;Web应用的规模和复杂性持续增长&#xff0c;微前端&#xff08;Micro Frontends&#xff09;已成为应对大型项目挑战的主流架构。通过将前端应用拆分为多个独立模块&#xff0c;微前…

定时器:中央对齐模式剖析

中央对齐模式&#xff08;Center-Aligned Mode&#xff09;下&#xff0c;当配置为 模式3&#xff08;CMS[1:0] 11&#xff09; 时&#xff0c;定时器会同时触发 上溢中断&#xff08;ARR中断&#xff09; 和 下溢中断&#xff08;0中断&#xff09;&#xff0c;即一个PWM周期…

MySQL强化关键_019_索引优化

目 录 一、最左前缀原则 1.完全使用索引 2.部分使用索引 3.不使用索引 4.效率折损 &#xff08;1&#xff09;使用范围查找 &#xff08;2&#xff09;索引断开 二、索引失效场景 1. 索引列参与运算 2.索引列模糊查询以“%”开始 3.索引列是字符串类型&#xff0c;查…

【Oracle】安装单实例

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 安装前的准备工作1.1 硬件和系统要求1.2 检查系统环境1.3 下载Oracle软件 2. 系统配置2.1 创建Oracle用户和组2.2 配置内核参数2.3 配置用户资源限制2.4 安装必要的软件包 3. 目录结构和环境变量3.1 创建Ora…

6年“豹变”,vivo S30系列引领手机进入场景“体验定义”时代

出品 | 何玺 排版 | 叶媛 5月29日晚&#xff0c;备受用户期待的vivo S30系列如约而至。 相比前几代S系列产品&#xff0c;S30系列变化显著&#xff0c;堪称“豹变”。首先&#xff0c;其产品打造思路发生了质变&#xff0c;产品体验更好&#xff0c;综合竞争力更为强。其次&a…

线性动态规划

具有「线性」阶段划分的动态规划方法统称为线性动态规划&#xff08;简称为「线性 DP」&#xff09;&#xff0c;如下图所示。 一、概念 如果状态包含多个维度&#xff0c;但是每个维度上都是线性划分的阶段&#xff0c;也属于线性 DP。比如背包问题、区间 DP、数位 DP 等都属…

Rust 学习笔记:使用自定义命令扩展 Cargo

Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Rust 学习笔记&#xff1a;使用自定义命令扩展 Cargo Cargo 支持通过 $PATH 中的 cargo-something 形式的二进制文件拓展子命令&#xff0c;而无需修改 Cargo 本身。 …

NodeMediaEdge任务管理

NodeMediaEdge任务管理 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 在未使用NodeMediaServer的情况下&#xff0c;或是对部分视频流需要单独推送的需求&#xff0c;也可…