当前位置: 首页 > news >正文

51c大模型~合集127

我自己的原文哦~     https://blog.51cto.com/whaosoft/13905076

#Executor-Workers架构

图解Vllm V1系列2

本文详细介绍了vllm v1的Executor-Workers架构,包括Executor的四种类型(mp、ray、uni、external_launcher)及其适用场景,以及通过图解展示了Executor与Workers之间的数据传输机制和整体架构,帮助读者理解vllm v1在分布式推理中的核心设计和运作方式。

前文:图解Vllm V1系列1:整体流程

在前文中,我们讨论了 vllm v1 在 offline batching / online serving 这两种场景下的整体运作流程,以offline batching为例:

图片

整体上来看:

vllm v1将请求的pre-process和输出结果的post-process与实际的推理过程拆分在2个不同的进程中(process0, process1)。

Client负责请求的pre-process和输出结果的post-process,EngineCore负责实际的推理过程,不同进程间使用ZMQ来通信数据。

对于offline batching和online serving来说,它们会选取不同类型的Client进行运作,但是它们的EngineCore部分运作基本是一致的,如上图所示。

通过这样的进程拆分,在更好实现cpu和gpu运作的overlap的同时,也将各种模型复杂的前置和后置处理模块化,统一交给processor和output_processor进行管理。

本文我们来关注上图中的Executor部分,也就是管控模型分布式推理的核心部分,我们关注的是它的整体架构和初始化过程,而它实际执行推理的细节,我们留到后续文章细说。

一、Executor的类型

在vllm中,Executor一共有4种类型,由配置参数--distributed-executor-backend决定,相关的代码和文档参见:

代码:

  • 决定executor的类型:https://github.com/vllm-project/vllm/blob/refs/tags/v0.8.2/vllm/config.py#L1465
  • 根据executor的类型,import具体的executor:https://github.com/vllm-project/vllm/blob/refs/tags/v0.8.2/vllm/v1/executor/abstract.py#L25

文档:

  • ​​https://docs.vllm.ai/en/stable/serving/engine_args.html​​
  • ​​https://docs.vllm.ai/en/stable/serving/distributed_serving.html#distributed-inference-and-serving​​

对于--distributed-executor-backend,默认情况下为None,你当然也可以手动指定。在默认情况下,vllm会根据你的分布式配置(world_size)和你所使用的平台特征(cuda、neuron、是否安装/初始化/配置了ray等)来自动决定--distributed-executor-backend的取值。

我们来简单介绍下这4种类型的Executor。

(1)mp:MultiprocExecutor

  • 适用场景:单机多卡。当单机的卡数满足分布式配置,且没有正在运行的ray pg时,默认使用mp
  • 在mp的情况下,Executor成为一个主进程,其下的若干个workers构成了它的子进程们

(2)ray:RayDistributedExecutor

  • 适用场景:多机多卡
  • 在ray的情况下,Executor成为一个ray driver process,其下管控着若干worker process

(3)uni:UniProcExecutor

  • 适用场景:单卡或 Neuron环境

(4)external_launcher:ExecutorWithExternalLauncher

  • 适用场景:想要用自定义的外部工具(例如Slurm)来做分布式管理

注意:以上的“适用场景”描述的是一般情况,更具体的细节,请参见“决定executor类型”的相关代码。

在本文中,我们将以mp: MultiProcExecutor进行讲解,并假设这里的分布式配置仅用了tp,其余的细节留给用户自行阅读。

二、Executor -> Workers

2.1 整体架构-官网版

我们先来看下官方给出的Executor-Workers架构图。

​​https://blog.vllm.ai/2025/01/27/v1-alpha-release.html​​

图片

上图右侧刻画了V1的架构:

  • Scheduler和Executor都位于EngineCoreProc所在的进程上。如本文第一章offline batching的流程图所示,Scheduler决定单次调度步骤中要送去推理的请求,并将这些请求发送给Executor。
  • 一个Executor下管理着若干workers,每个workers位于独立的进程上,可以理解成一个workers占据着一张卡
  • Executor负责把请求broadcast到各个workers上
  • 各个workers接收到请求,负责执行实际的推理过程,并将推理结果返回给Executor。

相比于V0,V1这种架构设计的优势在于:在V0中,worker0既要负责调度和数据分发、又要负责实际的推理计算。如此一来,各个workers间存在负载不均的问题,而worker0将成为性能的瓶颈。而V1通过拆分【调度】和【计算】过程解决了这个问题。

2.2 整体架构-细节版

现在我们已经通过vllm官方的示例图,初步了解了V1下Executor-Workers的架构,现在我们扩展这张架构图,来看更多的细节,为了画图简明,这里我们只展示了其中1个worker,没有画出全部workers:

图片

上图展示的是使用MultiprocExecutor下的架构,如前文所说,该类型的Executor常被用于单机多卡的推理场景,我们按照从上到下,从左到右的顺序来解读上图。

1、MultiprocExecutor和Scheduler都位于EngineCoreProc所在的进程中。Scheduler负责决定单次调度步骤中,要送去推理的reqs,并将这些reqs传递给MultiprocExecutor。

2、在MultiprocExecutor上,我们将创建一个rpc_broadcast_mq队列:

  • 该队列存储着Executor要broadcast给各个workers的【小数据(<=10MB)】,而【大数据(>10MB)】则不会进入此队列,而是通过zmq socket进行传输
  • 每条数据可以被粗糙理解成是(method, data)的形式,data = 数据本身,method=你期望worker上调用什么样的方法来处理这条数据。
  • 针对这个队列、以及大小数据的传输细节,我们将在本文第三部分详细介绍。

3、在MultiProcExecutor上,通过make_worker_process创建子进程:

  • 每个进程占据一张卡,每个进程上运行着一个worker实例
  • 在创建每个子进程时,我们会将rpc_broadcast_mq_handler,也就是输入队列的句柄也传递给子进程,这里你可以粗糙将“handler(句柄)”理解成是一个“地址”,有了这个地址,每个子进程才知道要去哪里找到并【连接】这个队列,以此读到队列中的数据。相关细节我们同样在后文给出。

4、每个Worker实例又由以下几部分组成:

  • WorkerWrapper,每个Worker实例都有属于自己的WorkerWrapper。你可以将它形象理解成是一个worker的manager,它负责管控一个worker的生命周期(创建->销毁)、所占资源、扩展功能(例如在rlhf场景下的一些功能)等等。
  • Worker,真正的Worker实例,它上面维护着两个重要队列:
  • rpc_broadcast_mq:正如3中所说,单个worker通过rpc_broadcast_mq_handler这个句柄,连接上了Executor的rpc_broadcast_mq队列,这样它就能从这个队列中读取(method, data)数据。注意,这里说的是【连接】而不是创建,为了强调这一点,图中单worker上的该队列用虚线表示。
  • worker_response_mq:单个worker【创建】的、用于存放这个worker上推理输出结果的队列。同样也会产出worker_response_mq_handler这个句柄。后续这个句柄将通过zmq socket传送给Executor,让Executor可以连接上这个队列,这样Executor就可以获得每个worker的输出结果。
  • ModelRunner,一个worker实例下维护着一个ModelRunner实例,这个实例上维护着模型权重分片(model weights sharding)、这块卡上的kv_caches、attn_backend等一系列的具体模型信息,它将最终负责模型权重的加载(load_model),并执行实际的推理过程。

5、连接Executor和Worker的ZMQ sockets:

  • Executor和Worker分属不同的进程,这里依然采用ZMQ sockets做进程间的通信。
  • 这里其实创建了多个不同socket(为了表达简便,我统一画成ZMQ sockets),每个socket会用于不同内容的通信,例如:
  • ready_socket:worker进程向Executor发送ready信号 + worker_broadcast_mq_handler
  • local_socket:如前文所说,**除了使用上述的2个队列做Executor->Worker间的输入输出通信外,我们还会直接使用local_socket做输入输出通信。前者用于单机内快速通信较小的数据(<=10MB),后者用于通信大数据(>10MB)**。我们会在后文细说这一点。
  • 等等

**6、worker_busy_loop()**:

在worker上启动busy loop,持续监听Executor发送的数据、做推理、并将推理结果持续返回给Executor。这样一来,这个worker就无限运转起来了,除非收到用户信号,显式终止掉这个worker,否则这个busy loop不会停止。

到此为止,我们简单总结一下在Executor->Workers的初始化环节都做了什么事:

  • 首先,按照上图所示,创建了Executor->Workers架构,特别注意上述2个输入输出队列的初始化和连接。
  • 对于每个Worker,我们通过init_device(),将它绑到指定的卡上,并对它做分布式环境初始化(即制定它的分布式通信group)
  • 对于每个worker,我们通过load_model(),当ModelRunner实际去加载这个worker所要的模型分片
  • 在每个worker上启动run_busy_loop(),让worker持续不断地运转起来。 更多的细节,请大家自行阅读源码。

接下来,我们着重来讨论这rpc_broadcast_mq和worker_response_mq这两个输入输出队列。

三、Executor与Worker间的数据传输机制

我们先快速回顾一下上文的内容:

(1)在我们的例子中,Executor的具体类型是MultiprocExecutor,它一般适用于单机多卡推理。

(2)Executor和Worker分属不同的进程,Executor需要把输入数据broadcast到Worker上,Worker需要把推理的输出结果返回给Executor。

(3)对于小数据(<=10MB),vllm使用rpc_broadcast_mq和worker_response_mq来做数据传输,这两个队列的本质是ShmRingBuffer(环形共享缓存),其中Shm即我们熟知的shared_memory,而ring是使用环形的方式往shm中读写数据(看不懂也没关系,我们马上来说细节)。

(4)对于大数据(>10MB),vllm使用zmq socket来做数据传输。

为什么要设计2种不同的进程间通信机制,来分别处理【小数据】和【大数据】呢?这里简单说几个我能想到的原因:

(1)首先,通过shm的方式读写数据时,不同的进程都从同一块共享内存(shm)上直接读取,这样数据不需要从一个进程的地址空间复制到另一个进程的的地址空间,也就是可以实现数据的“零拷贝访问”

(2)其次,通过shm的方式读写数据时,可以避免网络协议栈和数据重复写入的开销,可以实现更高效、更快的数据访问。

(3)那么,既然shm这么好,为什么只让【小数据】使用它,而让【大数据】走zmq socket呢?这是因为shm是一块固定的内存大小,一旦预分配好,就不能被改变了。在实际使用场景中,可能需要传输的数据量本身就不大,只是会偶发出现一些【大数据】传输的情况,因此我们没必要预留更大的shm空间,来应对这些只是偶发情况,这样会造成内存的浪费。所以我们额外使用zmq socket来处理这些偶发情况。

3.1 ShmRingBuffer(共享环形缓存)

我们先来看小数据传输的实现机制,相关代码参见:

​​https://github.com/vllm-project/vllm/blob/refs/tags/v0.8.2/vllm/distributed/device_communicators/shm_broadcast.py#L44​​

假设我们现在只使用tp,即一个Executor下有若干tp workers,那么:

  • Scheduler生成单次调度的结果,将这些结果传递给Executor,我们称单次调度的结果为一个chunk
  • Executor拿到单次调度的结果,写入rpc_broadcast_mq(本质是ShmRingBuffer)中
  • 这些tp workers都需要从rpc_broadcast_mq读取这个chunk(每个tp worker的输入是相同的)
  • 各个tp workers执行推理,并将推理结果写入各自维护的worker_broadcast_mq(本质是ShmRingBuffer)中。
  • Scheduler继续生成单次调度结果(chunk),重复以上步骤。
  • 不难发现,对于一个chunk,我们总有1个writer,和1个或若干个readers,例如:
  • rpc_broadcast_mq的chunk中,writer = Executor,readers = tp workers
  • worker_broadcast_mq的chunk中,writer = 某个tp worker,reader = Executor

现在,让我们将ShmRingBuffer想象成是一个存储站:

  • 这个存储站中有max_chunks个柜子,每个柜子用于存储一块数据(chunk),max_chunk默认值为10
  • 每个柜子的最大数据存储量为max_chunk_bytes,该值当前默认为10MB
  • 每个柜子上有一个面板(metadata),这个面板上有1 + n_reader个指示灯。其中1这个指示灯代表written_flag,即用于指示writer是否把chunk塞进了柜子(写入完毕),n_reader个指示灯代表reader_flags,分别表示这些readers是否已经将这个chunk读取完毕。
  • 由此可知,对于一个柜子,只有当writer写入完毕后,readers才可以去读。只有当所有readers都读取完毕后,这个柜子里的chunk才可以被“废弃”,也就是这个柜子才可以重新回到“可写入”的状态,让writer写入新数据。
  • Scheduler在做一轮又一轮的调度,产出一个又一个的chunk,那么这些chunk就按照顺序,依次装入这些柜子中,当这10个柜子的数据都被轮番用过以后,下一次再来新chunk前,就从0号柜开始复用起(当然要按照上条所说的,检查该柜子是否达到可复用状态),这种环形使用的方式,称之为“ring”。

有了以上这个形象的理解,现在我们再回过头来看vllm代码中的这部分注释,就不难读懂了,而关于代码的更多细节,请大家自行阅读源码:

图片

图片

3.2 zmq socket

正如前文所说,在Executor和Worker间做大数据(>10MB)的传输时,可以使用zmq socket,这块就是传统的zmq socket构建流程了,没有太多可说的。这里我们想结合worker.worker_busy_loop()(也就是一个worker持续读取输入、进行推理、写入输出)的过程,来具体看一下shm和zmq socket是如何配合运作的。

worker_busy_loop()入口:

  • ​​https://github.com/vllm-project/vllm/blob/refs/tags/v0.8.2/vllm/v1/executor/multiproc_executor.py#L362​​

图片

从代码中我们发现一件有趣的事:这里好像只从shm上读取数据,并没有通过zmq socket呀!不要紧,我们现在深入rpc_broadcast_mq.dequeue()中一探究竟。

rpc_broadcast_mq.dequeue():

  • ​​https://github.com/vllm-project/vllm/blob/refs/tags/v0.8.2/vllm/distributed/device_communicators/shm_broadcast.py#L462​​

图片

整体上说:

  • 当一个chunk过来时,我们会先检查它的大小:
  • 如果<=10MB,则装入shm对应的柜子中
  • 如果 > 10MB,则先在shm对应的柜子中记上一笔(buf[0]==1),然后再通过zmq sokcet去send这份数据
  • 以上过程不在所提供的代码截图中,需要大家自行找相关代码阅读
  • 接着,我们会根据这个柜子的标志buf[0]是否为1,来检测对应的chunk是装在柜子里,还是通过zmq socket发送了。如果是前者,那么直接从shm读;如果是后者,那么就通过zmq socket做receive。
  • 最后,如果当前chunk是大数据,虽然它不会装在对应的柜子里,但我们也会认为这个柜子已经被使用过。这样后一个chunk来的时候,它不会使用当前的柜子,而是使用下一个可用的柜子。

你可能会发现,在上述dequeue的代码中,存在2种zmq socket:local_socket和remote_socket,前者用于单机内的通信(writer和readers在一台node内),后者用于多机间的通信(writer和readers不在一台内)。由于我们当前都是以MultiprocExecutor这种单机场景为例的,所以我们提到的zmq socket都是指local_socket。

好,关于Executor->Worker架构的介绍就到这里了,大家可以配合本文,自行阅读源码,获取更多细节。在这个系列后面的文章中,我们还会看到更多Executor-> Worker配合运行的更多例子。

#T2I-R1

文生图也能这样玩?T2I-R1:把R1的推理范式应用到文生图任务!

文生图进入R1时刻:港中文MMLab发布T2I-R1。

论文:https://arxiv.org/pdf/2505.00703

代码:https://github.com/CaraJ7/T2I-R1

最近的大语言模型(LLMs)如OpenAI o1和DeepSeek-R1,已经在数学和编程等领域展示了相当强的推理能力。通过强化学习(RL),这些模型在提供答案之前使用全面的思维链(CoT)逐步分析问题,显著提高了输出准确性。最近也有工作将这种形式拓展到图片理解的多模态大模型中(LMMs)中。然而,这种CoT推理策略如何应用于自回归的图片生成领域仍然处于探索阶段,我们之前的工作Image Generation with CoT(https://github.com/ZiyuGuo99/Image-Generation-CoT)对这一领域有过首次初步的尝试。

与图片理解不同,图片生成任务需要跨模态的文本与图片的对齐以及细粒度的视觉细节的生成。为此,我们提出了适用于图片生成的两个不同层次的CoT推理:

图片

Semantic-CoT

Semantic-CoT 是对于要生成的图像的文本推理,在图像生成之前进行。

负责设计图像的全局结构,例如每个对象的外观和位置。

优化Semantic-CoT可以在图片Token的生成之前显式地对于Prompt进行规划和推理,使生成更容易。

Token-CoT

  • Token-CoT是图片Token的逐块的生成过程。这个过程可以被视为一种CoT形式,因为它同样是在离散空间中基于所有先前的Token输出后续的Token,与文本CoT类似。
  • Token-CoT更专注于底层的细节,比如像素的生成和维持相邻Patch之间的视觉连贯性。
  • 优化Token-CoT可以提高生成图片的质量以及Prompt与生成图片之间的对齐。

图片

然而,尽管认识到这两个层次的CoT,一个关键问题仍然存在:我们怎么能协调与融合它们? 当前主流的自回归图片生成模型如VAR完全基于生成目标进行训练,缺乏Semantic-CoT推理所需的显式文本理解。虽然引入一个专门用于提示解释的独立模型(例如LLM)在技术上是可行的,但这种方法会显著增加计算成本、复杂性和部署的困难。最近,出现了一种将视觉理解和生成合并到单一模型中的趋势。在LMMs的基础上,这些统一LMMs(ULMs)不仅可以理解视觉输入,还可以从文本提示生成图像。然而,它们的两种能力仍然是解耦的,通常在两个独立阶段进行预训练,没有明确证据表明理解能力可以使生成受益。鉴于这些潜力和问题,我们从一个ULM(Janus-Pro)开始,增强它以将Semantic-CoT以及Token-CoT统一到一个框架中用于文本生成图像:

图片

我们提出了BiCoT-GRPO,一种使用强化学习的方法来联合优化ULM的两个层次的CoT:

我们首先指示ULM基于Image Prompt来想象和规划图像来获得Semantic-CoT。然后,我们将Image Prompt和Semantic-CoT重新输入ULM来生成图片以获得Token-CoT。我们对于一个Image Prompt生成多组Semantic-CoT和Token-CoT,对于得到的图像计算组内的相对奖励,从而使用GRPO的方法来在一个训练迭代内,同时优化两个层次的CoT。

与图片的理解任务不同,理解任务有明确定义的奖励规则,图像生成中不存在这样的标准化的规则。为此,我们提出使用多个不同的视觉专家模型的集成来作为奖励模型。这种奖励设计有两个关键的目的:

  • 它从多个维度评估生成的图像以确保可靠的质量评估
  • 作为一种正则化方法来防止ULM过拟合到某个单一的奖励模型

图片

根据我们提出的方法,我们获得了T2I-R1,这是第一个基于强化学习的推理增强的文生图模型。根据T2I-R1生成的图片,我们发现我们的方法使模型能够通过推理Image Prompt背后的真实意图来生成更符合人类期望的结果,并在处理不寻常场景时展现出增强的鲁棒性。

图片

图片

同时,定量的实验结果也表明了我们方法的有效性。T2I-R1在T2I-CompBench和WISE的Benchmark上分别比baseline模型提高了13%和19%的性能,在多个子任务上甚至超越了之前最先进的模型FLUX.1。

图片

图片

#One Step Diffusion Via ShortCut Models论文解读

AIGC新手,内容理解如有不对请多多指正。

原文:One Step Diffusion via Shortcut Models

github:GitHub - kvfrans/shortcut-models

摘要

为了缓解目前diffusion架构+flow matching生成速度慢且训练阶段复杂的问题提出了一个叫shortcut model的模型,整个训练过程采用单一网络、单一训练阶段。condition包括当前噪声强度,还取决于stepsize(为了在去噪过程中直接跳过),这个方法在作者的实验中比蒸馏的方法好,并且在推理的时候可以改变step budgets。

之前SD3采直流匹配训练,但是仍然需要28步,这篇论文在首页放了一张效果图,效果看起来很惊艳。

初步效果图

整个网络设置是端到端且只需要一次训练就可以完成一个one-step模型,不像之前的关于蒸馏的工作(参考Progressive Distillation for Fast Sampling of Diffusion Models、http://arxiv.org/abs/2211.12039、Relational Diffusion Distillation for Efficient Image Generation,这三个工作都基于教师-学生来蒸馏,通过多阶段的训练来逐渐折半DDIM的采样步数)。

前置知识

Flow-matching

流匹配的内容在网络上的很多博客都有讲解,这部分就简单带过一下。

流匹配实际上就是通过学习将噪声转化为数据的常微分方程(ODE)来解决生成模型问题,在直流匹配中,整个模型就把真实图像的概率分布和噪声的概率分布之间的路径当作一条直线进行传输,在给定 x0 和 x1 的情况下,速度 vt 是完全确定的。但是,如果只给定 xt,就会有多个可信的配对(x0、x1),因此速度会有不同的值,这就使得 vt 成为一个随机变量。Flow-matching模型就是用来估计预期值在xt条件下的vt是多少,然后vt是xt处所有可信速度的平均值。最后可以通过对随机采样的噪声 x0 和数据 x1 对的经验速度进行回归来优化流量模型。

例子就是直流匹配

例子就是直流匹配

这个速度vt就是直接用xt对t求导,就得到了x1-x0,然后整个模型优化就靠下面这个损失函数。

直流匹配的损失函数

直流匹配的损失函数

实际上就是用回归的损失去尽量让预测的速度能够符合直流匹配定义的速度。

然后去噪过程就是从流量模型中采样,首先从正态分布中采样一个噪声点 x0。然后根据学习到流模型从x0到x1迭代更新该点,整个过程可通过在较小的离散时间间隔内进行欧拉采样来近似实现,因为是直线传输。

为什么提出ShortCut models?

作者通过一个实验去研究了完美训练的ODE在步数减少之后的缺陷,具体来说就是步长有限的情况下,还是很难做到能够将噪声分布确定性地映射到我们需要的数据分布。

作者做的实验,这个图示还是很清晰的,仅给定 xt,vt虽然是根据直流的路线去学习的,但是学习得到的vt是存在固有的不确定性的,vt是指向数据点平均值的,直到缩减到一步,一步的话所有的vt几乎是指向一个点,并不能对应原始数据分布,多样性完全崩塌了

流量匹配学习预测从 xt 到数据的平均方向,因此跟随预测的步长越大,将跳转到多个数据点的平均值。在 t=0 时,模型接收纯噪声输入,并且(x0,x1)在训练过程中随机配对,因此 t=0 时的预测速度指向数据集平均值。因此,即使在流量匹配目标的最优状态下,对于任何多模式数据分布,一步生成都会失败。这段是作者原话,感觉说得蛮清晰,就不加个人理解了。

ShortCut Models

insight:可以训练一个支持不同sampling budgets的一个模型,以时间步长t和步长d为作为条件。那么就顺势提出了下面这个公式。

shortcut models的核心公式

shortcut models的核心公式

这个s就是输入Xt,t,d之后的出来的捷径,得到这个路径之后就可以直接让Xt从这个s出发跳步得到Xt+d,OK,那么整个model的训练目标就很明确了,就是通过shortcut model去学习这个s,条件是Xt,t,d。其实整个公式就是直流匹配的跳步模式,当d≈0的时候,就是flow-matching的训练模式,s就直接退化成了v。

那么要学的东西出来了,用什么去约束呢?第一种方法当然就是用小步长去接近flow-matching的forward过程,但是这样做的话训练成本也还是很高,尤其是对直接端到端训练来说,并且小步长实际上对flow-matching的改进不是很大。第二种就是本文用的方法,直接用shortcut model自己的性质,就是一个s步等于两个s/2步。也就是以下公式。

shortcut等价模型

shortcut等价模型

初步看这个公式可能会疑惑为什么会除以2,请注意,上一个公式在s求出来之后还需要乘d,所以s其实不是最终路程,最终的路程是s*d,而整个式子左边的步长为2d,路程相同的情况下,两边同时除以2d才得出来右边等式的1/2系数。

d>0的时候就直接用这个公式,d=0就直接用流匹配去训练。整体流程如下

shortcut对flow-matching的优化

其实就是将flow-matching当作连续的一条线,shortcut直接输入了步长,然后网络获得步长之后直接去获得应道到路径上的哪个路径点,就是上面图左边曲线的黄色部分。整个训练过程把flow-matching综合起来构成了下面的损失函数:

总体损失函数

总体损失函数

上述目标学习的是从噪声到数据的映射,在任何步长序列下查询时都是一致的,包括直接在单步中查询。目标中的流量匹配部分将捷径模型建立在小步长的基础上,以匹配经验速度样本。这就确保了捷径模型在多步长查询时具有基础生成能力,这与等效的流量匹配模型完全相同。第二部分的话,通过串联两个较小shortcut的序列,为较大步长构建适当的目标。这样,生成能力就从多步到少步再到一步。综合目标可通过单一模型和单一端到端训练运行进行联合训练。

训练细节

名词定义:经验目标就是对应损失函数第一项需要的目标,一致性目标就是对应损失函数第二项所需要的目标

当 d → 0 时,s等同于vt。因此可以使用flow-matching的损失来训练d=0时的捷径模型,即随机抽样 (x0, x1) 对并拟合vt的期望值。这个项可以看作是小步s的基础,以匹配数据去噪ODE,然后对t ∼ U (0, 1) 进行均匀采样。为了限制复合误差,并且限制引导路径的总长度。因此,我们选择了一种二元递归模型,即用两条捷径来构建一条两倍大的捷径。

然后确定一个步数 M 来表示逼近 ODE 的最小时间单位;在实验中使用了 128 步。根据 d∈ (1/128, 1/64 ... 1/2, 1),这将产生 log2(128) + 1 = 8 种可能的捷径长度。在每个训练步骤中,我们对 xt、t 和随机 d < 1 进行采样,然后使用shortcut连续进行两步。然后将这两步的并集作为目标,并且在2d处训练模型。

将 1-k 个经验目标与k个一致性目标的比例结合起来,构建一个训练批次。k=1/4是合理的。其实这部分也很好理解,因为这个端到端模型实际上就是需要先训练一个flow-matching较好的模型,然后第二项只是在flow-matching的基础上进行优化,如果flow-matching训练得不好,后一项自然训练不好,因为s_target是需要从flow-matching模型中采样的,后一项只能在d=0训练的基础模型上去拟合这个模型,本质上shortcut还是一个教师-学生的思路,但是不同于之前教师和学生都是模型,shortcut将教师-学生拆分为两个损失函数去训练同一个模型,从而实现了端到端。

CFG设定:评估 d = 0 时的捷径模型时使用 CFG,而在其他情况下则放弃 CFG。CFG 在捷径模型中的一个局限性是,必须在训练前指定 CFG 比例。

EMA:用EMA去从d=0的模型上生成d=1的一致性目标,本质上就是平滑一下误差。

其他就是一些网络设置,这里就不一一阐述了,有兴趣可以自己查看一下原论文。

实验结果

FID-50K分数评估

FID-50K分数评估

可以看到在端到端的训练框架中,shortcut models的FID-50k是SOTA,但是相对于PD的蒸馏方式来说,在一步蒸馏中效果还是有待提高。

对ShortCut提出需解决问题的验证

FID下降趋势

在文章开投我们就提到了这篇论文的insight,他是为了缓解flow-matching在步数极低的情况下的崩塌而提出了,这个实验也证明了这一点,在1步模型中,Shortcut的表现完全暴打直接用flow-matching训练的diffusion(但实际上这个对比没有什么特别大意义,flow-matching确实就不适合一步训练,这个问题SD3当时也提出来了)。

作者在后续甚至验证了shortcut在其他领域的鲁棒性,确实是一项非常完善的工作,有其他领域的读者可以去看下原文。

总结

shortcut models确实提供了一个直接在flow-matching上蒸馏的好办法,但是训练过程中的参数设定个人感觉还是靠多种尝试,例如K的选取或许会较大程度影响shortcut models的发挥。反观多阶段的训练方法,至少多阶段确保了一个训练得较为完善的教师模型能够作为参考,而shortcut models如果参数设置不对,flow-mathcing的基础模型可能会不够完善,进而倒是损失第二项会出现较大程度的累计误差。

其次,作者本人也提到了,虽然shortcut能够抑制flow-matching直接在1步训练上的崩溃,但是在步数太低的时候仍然和多步采样存在较大的性能差距(不过1步能做到这个程度已经很好了。。。)。

总的来说,这篇论文的工作很完善,也是一个比较新颖的减少采样步数的方案,但是本质上也是蒸馏的一种,并且端到端的训练相比于多阶段的训练确实更依靠经验,一不注意就会训练失败。

#Test-Time Scaling

突破大模型推理瓶颈!首篇「Test-Time Scaling」全景综述,深入剖析AI深思之道

本文由来自香港城市大学、麦吉尔大学(McGill)、蒙特利尔人工智能实验室(MILA)、人大高瓴人工智能学院、Salesforce AI Research、斯坦福大学、UCSB、香港中文大学等机构的多位研究者共同完成。第一作者为来自香港城市大学的博士生张启源和来自蒙特利尔人工智能实验室(MILA)的博士生吕福源。

当训练成本飙升、数据枯竭,如何继续激发大模型潜能?

💡 在追求通用人工智能(AGI)的道路上,大模型训练阶段的「暴力堆算力」已经逐渐触及天花板。随着大模型训练成本急剧攀升、优质数据逐渐枯竭,推理阶段扩展(Test-Time Scaling, TTS) 迅速成为后预训练时代的关键突破口。与传统的「堆数据、堆参数」不同,TTS 通过在推理阶段动态分配算力,使同一模型变得更高效、更智能 —— 这一技术路径在 OpenAI-o1 和 DeepSeek-R1 的实践中已初显威力。 

图片

图 1:预训练扩展和推理阶段扩展的示意。

在数学、编程等硬核任务上,TTS 表现亮眼;而在开放问答、多模态理解乃至复杂规划等场景中,它同样展现出巨大潜力。目前,研究者已探索了多种 TTS 策略,如 Chain-of-Thought (CoT)、Self-Consistency、Search 和 Verification,但该领域仍缺乏统一的研究视角与评估框架。

📘 最近,来自香港城市大学、麦吉尔大学(McGill)、蒙特利尔人工智能实验室(MILA)、人大高瓴人工智能学院、Salesforce AI Research、斯坦福大学、UCSB、香港中文大学等机构的多位研究者联合发布了首篇系统性的 Test-Time Scaling 领域综述。该文首次提出「What-How-Where-How Well」四维分类框架,系统拆解推理优化技术,为 AI「深思」绘制全景路线图。

论文标题:A Survey on Test-Time Scaling in Large Language Models:What, How, Where, and How Well

论文链接:https://arxiv.org/pdf/2503.24235

项目主页:https://testtimescaling.github.io/

GitHub 仓库:https://github.com/testtimescaling/testtimescaling.github.io/  

🔍 论文亮点概览:

本篇 Survey 首次提出了一个覆盖全面、多层次、可扩展的四维正交分析框架:

  1. What to scale:扩什么?CoT 长度、样本数、路径深度还是内在状态?
  2. How to scale:怎么扩?Prompt、Search、RL,还是 Mixture-of-Models?
  3. Where to scale:在哪扩?数学、代码、开放问答、多模态……
  4. How well to scale:扩得怎样?准确率、效率、控制性、可扩展性……

在这个框架下,作者系统梳理了当前的主流 TTS 技术路线,包括:

  1. 并行策略:即同时生成多个答案,并选出最优解(如 Self-Consistency / Best-of-N)
  2. 逐步演化:即通过迭代修正逐步优化答案(如 STaR / Self-Refine)
  3. 搜索推理:结合并行与序列策略,探索树状推理路径(如 Tree-of-Thought / MCTS)
  4. 内在优化:模型自主控制推理步长(如 DeepSeek-R1 / OpenAI-o1)

基于这一框架,作者系统性地梳理了现有文献,实现了四大核心贡献:

  1. 文献解析:通过结构化分析方法,清晰界定各项研究的创新边界与价值定位;
  2. 路径提炼:总结出推理阶段扩展技术的三大发展方向:计算资源动态优化、推理过程增强和多模态任务适配;
  3. 实践指导:针对数学推理、开放问答等典型场景,提供具体可操作的技术选型建议;
  4. 开放社区:抛弃传统调研自说自话的特点,通过结合主页希望营造一个专门为 TTS 讨论的开放社区,集所有研究者的智慧,不断与时俱进更新更加实践的指导。

与同类综述相比,本文特别注重实用价值和开放讨论,不仅系统评估了不同 TTS 策略的性价比,还前瞻性地探讨了该技术的未来演进方向,包括轻量化部署、持续学习融合等潜在突破点。

作者表示,Test-time Scaling 不仅是大模型推理的「第二引擎」,更是迈向 AGI 的关键拼图。教会模型「三思而后行」,是我们迈向通用人工智能的重要旅程。

框架介绍

作者提出的框架从四个正交维度系统解构 TTS 技术:

1. What to Scale(扩展什么)- 界定推理过程中需要扩展的具体对象,包括:

  • Parallel Scaling(并行扩展):并行生成多个输出,然后将其汇总为最终答案,从而提高测试时间性能;
  • Sequential Scaling(序列扩展):根据中间步骤明确指导后面的计算;
  • Hybrid Scaling(混合扩展):利用了并行和顺序扩展的互补优势;
  • Internal Scaling(内生扩展):在模型内部参数范围内自主决定分配多少计算量进行推理,在推理时并不外部人类指导策略。

其中,作者为每一个扩展的形式,都进行了一些经典工作的介绍,从而丰富了对于扩展策略的外延描述,例如:在并行扩展中作者根据得到覆盖性的来源分为两个更小的类别,在单个模型上的反复采样和多个模型的采样。

2. How to Scale(怎么扩展)- 归纳实现扩展的核心技术路径:

  • 训练阶段方法:监督微调(SFT)、强化学习(RL)等
  • 推理阶段技术:刺激策略(Stimulation)、验证技术(Verification)、搜索方法(Search)、集成技术(Aggregation)

这个章节是重点章节,作者收录并整理了大量的经典的和最前沿的技术,例如在训练阶段中的强化学习技术,伴随 R1 而大火,因此在短短两个月内涌现出大量的工作,作者将它们尽数收入,同时分成基于奖励模型和不需奖励模型两类;对于刺激策略,作者分成了提示(Prompt),解码(Decode)、自重复(Self-Repetition)、模型混合(mixture-of-model)四类。

3. Where to Scale(在哪里扩展)- 明确技术适用的任务场景与数据集特性。

作者在这里提出尽管 TTS 的推出和验证是在某一类特定的推理任务上得到成功的,可是已经有足够多的工作开始显现出 TTS 是一种通用地能够提升在多样任务的策略,由此作者以推理(Reasoning)和通用 (General Purpose) 两类进行分类,一方面强调了 TTS 在越来越多样、越来越先进的推理任务中有很明显的效果,另一方面也不断跟踪 TTS 在更多通用任务上应用的效果。值得注意的是,作者整理出一个评测基准的表格,方便更多研究者直接从中去选择合适自己的基准。

4. How Well to Scale(效果怎么样)- 建立多维评估体系:

在当下,TTS 已经不仅是一个提高任务准确率的策略,当它成为一个新的值得被研究的核心策略时,对 TTS 的要求会更加多元化,这也是未来研究的主题。作者认为之后对 TTS 的优化重点将不仅仅局限在准确率的提升,是在于如何提高效率、增强鲁棒性和消除偏见等。

图片

图 2:作者提出的 TTS 框架,包括 what, how, where 和 how well to scale。

作者不仅在每个维度下提供细粒度子类划分,还配套标注了代表性研究工作(如图 2 所示),使分类体系兼具理论完备性和实践指导价值。这一结构化的基础使得后续研究可以无缝地融入作者的分类体系,更清晰地展现其贡献。

为了更好的理解 what to scale 中的并行扩展,序列扩展,结合扩展和内生扩展,作者用一张清晰的示意图进行形象化的展示,同时,在图中使用 how to scale 的技术来组成不同的扩展策略,很好地示意了两个维度如何结合在一起。

图片

图 3:从 what to scale 到 how to scale。

实践特色

作者强调本篇 Survey 以实用为原则,具体包括:使用所提出的框架分析文献,以及整理操作指南。

文献解析:为了帮助研究者系统性地剖析每项工作,作者设计了一个分析表格,通过将文献贡献对应到框架的四个维度(What/How/Where/How Well),以清晰地解构该工作。这种结构化分析方法不仅能清晰展现各研究的核心创新,更能有效揭示潜在的技术突破方向。

图片

表 1:在现有文献中进行推理扩展时常用的组合方式。

操作指南:另一个潜在的亮点是持续收集 TTS 开发中的实用操作指南,而这些操作指南将以问答的形式展现。作者期待这些问答是具体的、现实的、一线的,因此,作者期待这篇 Survey 将维持开放性,邀请更多在一线研究的学者来参与这项操作指南的收录和编写。下面是作者现阶段的操作指南的内容和风格。

图片

开放社区

有价值的洞见和实践指导是来自于第一线的科研和百花齐放的讨论的,作者期待将论文从传统的静态的一家之言转化为动态的百家之坛,并建立开放的社区来收集任何一线科研者提出的问题和总结的经验,而这些问题和经验在经过筛选后,会更新到最新的论文中,并在致谢中进行感谢。

图片

图片

挑战与未来

尽管 TSS 技术已崭露头角,本文总结了 TTS 当前面临的四大挑战:

  1. 扩展极限:在未来的 TTS 中,如何突破「暴力采样」的边际收益递减?我们急需在不同方向上探索策略
  2. 本质理解:tts 中多个模块是否真正驱动了推理改进?reward model 是否需要重新评估?我们依然需要在理论层面揭示技术有效性根源。
  3. 评估革新:传统指标无法捕捉推理过程质量,随着 test-time scaling 技术的发展,领域内急需开发细粒度评估体系,以便更全面地评估不同策略
  4. 跨域泛化:当前 TTS 方法在数学、代码任务中表现突出,但如何迁移至法律、金融等高风险场景?如何在推理过程中考虑现实世界的制约?

论文还指出,目前常见的技术如 SFT、RL、Reward Modeling 等虽被频繁使用,但背后的作用贡献尚不清晰,值得深入探索,例如:SFT 真的不如 RL 更泛化吗?R1 的时代下 SFT 的角色是什么?什么样的 Reward Modeling 更加高效?等等

此外未来 TTS 的发展重点包括:1. 统一评估指标(准确率 vs 计算开销);2. 拓展到金融、医学等真实场景;3. 构建具备自适应推理能力的通用智能体。

推理扩展策略正引领 AI 推理范式转变:让模型在「用」的时候持续变强。

#NYU教授公布2025机器学习课程大纲

所有人都在追LLM,高校为何死磕基础理论?

最近,Meta 公司首席 AI 科学家、图灵奖得主 LeCun 转发了他在纽约大学的同事 Kyunghyun Cho 的一篇帖子:内容是关于这位教授 2025 学年机器学习研究生课程的教学大纲和讲义。

image.png

讲义地址:https://arxiv.org/abs/2505.03861

教学大纲:https://docs.google.com/document/d/1OngR25IMEM5bJ458J8z4OCnTFG87KJ5ihgWojU1DD64

该课程聚焦于以随机梯度下降(SGD)为核心的基础机器学习算法,特意避开大型语言模型(LLM)内容,同时鼓励学生深入研读领域经典论文,回溯机器学习的理论发展脉络。

在这个人人都关注 LLM 的时代,这样的课程设计乍看似乎很特别。但对比其他高校的课程表会发现, 各大高校研究生机器学习课程仍普遍以基础理论和经典模型为核心。

比如斯坦福 CS229, 是经典的机器学习基础课程,2025 年冬季课程简介中,课程系统讲授包括线性回归、逻辑回归、SVM、神经网络、聚类、降维、EM 算法等基本模型与方法,强调数学推导与优化思想,广泛应用于跨领域研究。

image.png

MIT 的 6.790 课程是其研究生阶段的核心机器学习课程,前身为 6.867,现已更新为 6.7900。该课程强调从概率建模和统计推理的角度深入理解机器学习方法,适合希望在理论与实践之间建立坚实联系的学生。

image.png

清华电子系研究生课程也设置了《机器学习》《统计推断理论和方法》等核心理论课程。

image.png

而最新 LLM 内容多在专门选修课中出现,比如斯坦福大学 CS25: Transformers United,是一门专注于 LLM 和 Transformer 架构的研究型课程,详见报道《OpenAI、谷歌等一线大模型科学家公开课,斯坦福 CS 25 春季上新!》 。

可以看出,教育界普遍认为基础教学有助于学生长远发展。Cho 在撰写讲义时引用了 Sutton 的「苦涩教训」,强调通用可扩展方法(如以 SGD 为核心)比具体架构更重要。他刻意省略了复杂体系(如 LLM)而专注于历史上成熟的算法和数学直觉,认为「一个学期时间不足以深入所有主题」,只能先打下坚实基础。

此外,Cho 曾在博客中提到,2010–2015 年间深度学习尚未普及时,很多 ML 课程对神经网络仅作简单提及。

如今通过强调经典方法、阅读经典论文,可以让学生理解知识的源头与演进脉络,培养批判性思考能力。总体而言,基础导向的教学能让学生掌握算法背后的数学原理和优化方法,而不是「盲目套用」最新模型。

 理论 VS 实践

但我们无法逃避的一个问题是:大学培养机制(尤其是研究生 / 博士教育)强调基础、原理和科研能力,而实际工作环境尤其在工业界常常需要快速响应、工程落地、产品迭代能力。 

一味的强调「必须理解深层原理」,在某些语境下,确实可能显得有些「何不食肉糜」。

「你怎么连 attention 的 Q/K/V 向量都没推导过就来调模型?」现实可能是:「我只是想学个微调技巧,用 LLaMA 写个客服机器人。」

对此不少大学也在积极探索解决方案, 为弥补科研与工程能力脱节,不少学校推出了「桥接」课程或实践项目。 

例如,斯坦福大学在开设 CS229 等理论课的基础上,还专门设立了 CS329S《机器学习系统设计》实践课。这门课着重讲授如何构建可实际部署、运行稳定且具备扩展性的机器学习系统,内容包括数据处理、特征提取、模型上线与监控等环节。

image.png

CMU 的机器学习博士生必须修读 10-718《机器学习实践》课程。在这门课中,学生需要完成学期项目,从头到尾搭建并部署一个完整的机器学习系统。课程描述明确指出,学生将通过项目学习处理真实场景下的数据问题,掌握从原始数据清洗到模型最终上线的全流程技能。

image.png

国内高校也开始重视实践教学。清华大学电子系与企业合作开设了多门实用性课程,如「大数据技术的应用与实践」、「高阶机器学习」和「智能制造」等,将行业实际案例和编程实践引入教学过程。

image.png

为何高校仍执着于「慢功」?

在当今技术飞速发展的背景下,许多高校依然强调「打好基础、追求深刻理解」,这并非单纯的「固步自封」。

真正的技术能力不仅在于「会用工具」或「能跑模型」,而在于理解方法背后的原理,在面对新问题、新技术时,具备独立分析、判断和创造的能力。 吴恩达曾在一篇文章中以个人经历说明持续学习基础知识的重要性,他强调「牢靠且及时更新的基础知识是成为一名高产机器学习工程师的关键」。

文章链接:https://www.deeplearning.ai/the-batch/issue-146/

image.png

这种理念的核心在于「抗变化性」。技术潮流更新迅速,从 CNN 到 Transformer,再到 LLM 和多模态系统,每一步都可能颠覆现有工程范式。

要适应这些变化,不能仅靠追逐热点,而需深入掌握优化、泛化、表示学习等底层理论。只有理解「为何这样设计」以及「背后的假设是什么」,才能在面对全新技术时避免迷茫。

image.png

此外,深厚的基础是科研与技术创新的起点。科研不仅是调参或复现论文,更在于提出问题、构建假设、设计新方法。这离不开扎实的数学工具、严谨的逻辑训练以及对经典工作的积累。基础课程培养的不仅是知识点,更是抽象思维与批判性思考能力。

深度学习教父、图灵奖得主 Geoffrey Hinton 在接受 MIT Technology Review 采访时指出,正是对基础算法的长期坚持和深入研究,才推动了深度学习的突破,「我们花了几十年时间打磨神经网络的基本原理,直到 2010 年代才迎来真正的应用爆发。基础知识的积累和理解,是 AI 领域每一次重大进步的根本。」

当然,这种教育路径并非忽视实践,而是强调:真正的实践力应建立在理解力之上。不仅要会用工具,更要了解其来龙去脉、适用边界与改进方向。

因此,「找工作」与「打基础」并非非此即彼的选择题,而是时间维度上的权衡。短期内,工具技能能带来直接的岗位匹配;但长期来看,基础能力才是跨越技术周期、持续成长的「护城河」。

课程讲义

现在我们回过头来看看这份 100 页 pdf 的课程讲义,它对机器学习进行了全面介绍,涵盖了基础概念和现代技术,有兴趣的读者可以阅读原文。

WPS拼图0.png

每一章的结构和内容概要如下:

第一章:能量函数 介绍能量函数作为机器学习中的统一主题的概念。解释了不同的机器学习范式(监督学习、无监督学习、分类、聚类等)如何可以被构架为最小化能量函数。讨论潜在变量和正则化在定义和学习能量函数中的作用。

第二章:机器学习中的基本分类思想 涵盖了基本的分类算法,包括感知器、边际损失、softmax 和交叉熵损失。解释分类器训练中的反向传播,重点在于线性和非线性能量函数。讨论了随机梯度下降(SGD)和自适应学习率优化方法。涉及泛化和模型选择,包括偏差 - 方差权衡和超参数调整。

第三章:神经网络的基本构建块 探索了神经网络架构中常用的构建块。讨论了归一化技术(批量归一化、层归一化)。介绍了卷积块、循环块和注意力机制。介绍了神经网络中置换等变性和不变性的概念。

第四章:概率机器学习和无监督学习 说明了如何从概率角度解释能量函数。涵盖了变分推断和高斯混合模型。讨论了连续潜在变量模型和变分自编码器(VAEs)。介绍了重要性采样及其方差。

第五章:无向生成模型 探索无向生成模型,重点介绍受限玻尔兹曼机(RBMs)和专家乘积(PoE)。讨论马尔可夫链蒙特卡洛(MCMC)方法用于从 RBMs 中采样。引入基于能量的生成对抗网络(EBGANs)。涵盖自回归模型。

第六章:进一步话题 提供了机器学习中几个高级主题的概述。讨论了一步强化学习和多步强化学习。探索了集成方法(袋装法,提升法)和贝叶斯机器学习。介绍元学习。探讨混合密度网络和因果关系。

经典论文

背景.png

最后我们来看看 Cho 提到的经典论文,这里节选了一部分。

  • 「Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning」——Ronald J. Williams

论文地址:https://link.springer.com/article/10.1007/BF00992696

该论文提出了 REINFORCE 算法,一种基于策略梯度的强化学习方法,用于训练连接主义模型(如神经网络)。该算法通过直接优化期望奖励,奠定了现代策略梯度方法的基础。

  • 「Efficient Backprop」——Yann LeCun, Leon Bottou, Genevieve B. Orr, Klaus-Robert Müller(重点关注弟 4 节)

论文地址:https://link.springer.com/chapter/10.1007/978-3-642-35289-8_3

系统总结了反向传播(Backpropagation)的优化技巧,包括学习率调整、权重初始化、激活函数选择等。第 4 节特别讨论了高效训练神经网络的实用方法。

  • 「Training Products of Experts by Minimizing Contrastive Divergence」——Geoffrey Hinton

论文地址:https://www.cs.toronto.edu/~hinton/absps/nccd.pdf

提出了对比散度(Contrastive Divergence, CD)算法,用于训练受限玻尔兹曼机(RBM)和专家乘积模型。这是深度学习复兴前的重要工作,为后续深度信念网络(DBN)奠定了基础。

  • 「Auto-Encoding Variational Bayes」——D. Kingma, M. Welling

论文地址:https://arxiv.org/abs/1312.6114

提出了变分自编码器(Variational Autoencoder, VAE),通过变分贝叶斯方法实现高效的生成模型训练。VAE 结合了神经网络和概率建模,成为生成模型领域的里程碑。

  • 「Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks」——Chelsea Finn, Pieter Abbeel, Sergey Levine

论文地址:https://arxiv.org/abs/1703.03400

提出了 MAML(Model-Agnostic Meta-Learning),一种通用的元学习算法,使模型能够通过少量样本快速适应新任务。MAML 在少样本学习(Few-Shot Learning)领域具有开创性意义。

更多详细内容请参见原讲义和教学大纲。

#xxx

#Matrix-Game

生成视频好看还不够,还要能自由探索!昆仑万维开源Matrix-Game,单图打造游戏世界

世界模型的进度条,最近坐上了火箭。

去年 11 月,两家创业公司打造的 Oasis,首次在开源世界模型中实现了实时、可玩、可交互。生成的虚拟环境不仅包含画面,也体现出了对物理和游戏规则的理解。

图片

Oasis 世界模型的演示动画。

今年 4 月,微软开源的交互式世界模型 MineWorld,再次提升了视觉效果,大幅提升了动作生成的一致性。

图片

MineWorld 模型的生成效果。

上个星期,又有国外创业公司开源了 「多元宇宙」,能让不同玩家在一个世界模型里进行游戏。

眼看三维世界的 AI 研究越来越多,英伟达人工智能总监、杰出科学家 Jim Fan 提出了「物理图灵测试」,要给具身智能设立一个像图灵测试一样的标准:如果你分辨不出一个现实世界场景是不是由 AI 布置出来的,那完成任务的 AI 就可以认为通过了测试。

从前沿技术、应用再到测试基准,我们正在见证技术的全面兴起,众多科技公司蜂拥而入,仿佛大模型的爆发又要重演一遍。或许过不了多久,计算平台处理的单位就不再是 token,而是物理世界中的原子了。

今天又有更大的新闻曝出:5 月 13 日,昆仑万维宣布开源交互式世界基础模型 Matrix-Game,这不仅是世界模型技术向前迈进的一大步,更是空间智能领域交互式世界生成的重要里程碑。

图片

  • Github:https://github.com/SkyworkAI/Matrix-Game
  • HuggingFace:https://huggingface.co/Skywork/Matrix-Game
  • 技术报告:https://github.com/SkyworkAI/Matrix-Game/blob/main/assets/report.pdf
  • 项目主页:https://matrix-game-homepage.github.io

作为一款世界基础模型,Matrix-Game 能够生成完整可交互的游戏世界,能够对人类输入的操作指令进行正确响应,保留了游戏世界的空间结构与物理特性,画面也更加精致,超越了以往所有类似开源世界模型。

当然,它应用的应用范围不仅限于游戏,对于具身智能体训练与数据生成、影视与元宇宙内容生产也有重要意义。

昆仑万维表示,Matrix-Game 让世界不再只是被观看,而是被探索、被操控、被创造。这种主动式的探索或许正是空间智能发展的关键所在。

超越微软开源的交互式世界模型

Matrix-Game 强在哪儿?

Matrix-Game(17B+)是昆仑万维 Matrix 系列模型在交互式世界生成方向的首次落地,也是世界模型领域工业界首个开源的 10B + 大模型。

早在今年 2 月, 昆仑万维正式推出 Matrix-Zero 世界模型,迈出了其探索空间智能的关键一步。

昆仑万维表示,Matrix-Zero 其实包含两个子模型 —— 一个用于 3D 场景生成,另一个用于可交互的视频生成。

图片

当时就有人问:这个可交互的视频生成模型可以用来做游戏吗? 

图片

几个月后,昆仑万维给出了答案。这次发布的 Matrix-Game 就是可交互视频生成模型在游戏方向的落地,它能够根据用户输入(键盘指令、鼠标移动等)生成连贯、可控的游戏互动视频。

和行业内的其他模型相比,它有以下几个特点:

1. 可以实现细粒度的用户交互控制。

在游戏里,你可以通过按「W、S、A、D、Space、Attack」以及这些键的组合实现自由移动和攻击。在 Matrix-Game 创造的「我的世界(Minecraft)」游戏世界里,你可以得到相同的体验,无论控制信号是连续的(如视角转换)还是离散的(如前进、跳跃),而且每次移动都伴随着景物的变化。

比如在下面这个「前进 + 攻击」的场景中,游戏人物穿过一片树林来到池塘前,代表树木的方块在受到攻击后被破坏,这是模型生成的环境反馈信号。而且,虽然池塘和后面的山体大部分被树木遮挡,但模型依然生成了合理的结果,使得整个过程的景物变化非常丝滑。

图片

在一个「前进 - 向左 - 前进」的长镜头组合移动场景中,模型不仅严格遵守了用户的控制指令,还生成了丰富的景物变化,比如没入水中的逼真过程。

2. 生成效果具有高保真视觉与物理一致性。

在视频生成领域,能否保持视觉一致性、遵循物理规律是判断视频质量的试金石。但从业界的各种翻车视频来看,这些很难做好,更别说在交互视频这种需要推理交互效果的视频生成形式中。

但 Matrix Game 的表现令人眼前一亮,在交互中能生成物理上合理、视觉上一致的结果。

比如,在下面这个左右移动的场景中,草丛中的花有时会被树干遮挡,但随着脚步的进一步移动又会重现,这说明模型具有保持视觉一致性的能力。

再比如,在一个跳跃的操作中,我们能够看到河里的景物随着视角的变化而变化(跳起来之后,视角变高,能看到更全面的水底画面)。这都是模型根据所掌握的物理规律进行「脑补」的结果。

图片

3. 拥有多场景泛化能力

在前面的例子中,我们已经看到,Matrix Game 能够生成非常丰富的 Minecraft 游戏场景,比如森林、沙滩、河流、平原等,这些环境涵盖不同地形、天气和生物群系。

其实,除此之外,它还能向非 Minecraft 游戏环境泛化,生成城市、古建等开放式场景的互动视频。

4. 具有系统化的评估体系

对于交互式视频生成这种相对较新的模型,应该从哪些维度评估生成质量?如果不想清楚这个问题,模型就很难有明确的优化方向。为了解决这一问题,昆仑万维提出了一套专为 Minecraft 世界建模设计的统一评测框架 —— GameWorld Score。

具体来说,GameWorld Score 从视觉质量、时间一致性、交互可控性、物理规则理解这四个维度来评价模型。视觉质量是指每一帧图像的清晰度、结构一致性与真实感,这也是人类感知视频质量的几个重要维度。时间一致性、交互可控性和物理规则理解上文已经提及。这几个维度合在一起,首次实现了对可交互视频感知质量 + 控制能力 + 物理合理性的全方位衡量,补齐了现有基准的短板。

图片

在这个基准上,Matrix Game 与知名创业公司 Decart 的开源方案 Oasis 和微软的开源模型 MineWorld 进行了 PK,在四大维度上均取得领先成绩。

图片

图片

图源:Matrix-Game 技术报告

在双盲评测中,Matrix-Game 生成的视频评分也是大幅度领先:

图片

图源:Matrix-Game 技术报告

在控制性上,Matrix-Game 在「运动」、「攻击」等动作上实现了超过 90% 的准确率,细粒度视角控制下依然可以保持高精度响应。

图片

图源:Matrix-Game 技术报告

接下来是场景泛化能力,在 8 大典型 Minecraft 场景中,Matrix-Game 保持了全面领先,展现出卓越的环境适应性,这意味着它可以广泛应用于较复杂、动态的虚拟世界交互任务。

图片

图源:Matrix-Game 技术报告

可见,不论是从数据、模型还是实测角度来看,Matrix-Game 都树立了当前交互式世界模型的新标杆。

Matrix-Game 是怎样练成的?

在昆仑万维发布的技术报告中我们可以发现,Matrix-Game 取得的优异成绩主要得益于研究团队在数据、模型架构等方面做出的技术创新。

精挑细选的 Matrix-Game-MC 数据集

目前,业界已有越来越多的研究尝试让世界模型生成游戏场景,但它们往往难以有效捕捉物理规则,泛化能力有限。

Matrix-Game 改变了这一现状。它是一个参数规模达 17B 的世界基座模型,专注于交互式图像到世界的生成,通过两阶段训练策略(无标签数据预训练 + 标注数据可控训练)训练而来,其中用到了昆仑万维自主构建的大规模数据集 ——Matrix-Game-MC。

Matrix-Game-MC 数据集涵盖从无标签预训练数据到精细标注的可控视频全流程。其中,无标签预训练数据来自 MineDojo 数据集中的视频资源,研究团队利用 MineDojo 工具系统性地采集了约 6000 小时的原始 Minecraft 游戏视频,并设计了三阶段过滤机制,依次对画质美学、动态合理性与视角稳定性等方面进行筛选,最终获得了超过 2700 小时的中质量数据和 870 小时的高质量数据,用于支持基模型的无监督预训练。

图片

有标签部分则是采用探索代理(Exploration Agent)、程序化模拟(Unreal Procedural Simulation)两种策略混合生成的可控监督数据,包括高质量的《我的世界》游戏内容和在虚幻引擎(Unreal Engine)中手动构建的模拟交互场景,不仅包含精确的键盘与鼠标控制信号,也提供位置信息、动作标签及环境反馈信号,体量约 1000 小时。

另外得益于 Unreal 数据的融入,Matrix-Game 在更通用游戏场景的泛化上展现出了明显的优势。

图像到世界建模的模型架构

Matrix-Game 的目标是能够内化真实的物理交互、语义结构并支持交互式的视频生成。

从模型架构上看,Matrix-Game 的整体架构围绕图像到世界建模(Image-to-World Modeling)的方式设计。正如 2 月份 Matrix-Zero 所展示的,该系列模型受空间智能启发,纯粹从原始图像中学习,可参考单张图像生成能交互的视频内容。它通过构建一个一致的场景来学习理解世界,不依赖语言提示,仅基于视觉信号对空间几何、物体的运动及物理交互进行建模。

图片

其中,视觉编码器或多模态主干网络处理的参考图像作为主条件输入,在高斯噪声及用户动作条件下,由 DiT 生成潜在表示,然后通过 3D VAE 解码器将其解码为连贯的视频序列。

MatrixGame 能够直接通过视觉内容感知、解读和建模世界,可以实现一致且结构化的理解。结合用户的动作输入,世界模型可以像 AI 图像生成工具一样直接生成「3D 游戏画面」。为了避免此前很多世界模型生成长时序内容不停变化的出戏情况,Matrix-Game 每次生成会以之前的 5 帧运动作为上下文逐段递进生成,保证了输出内容在时间上的连贯性。

在交互可控的问题上,人们输入的键盘动作(如跳跃和攻击)以离散的 token 表达,视角的移动则以连续的 token 表达。作者使用 GameFactory 的控制模块,同时融入了多模态 Diffusion Transformer 架构,还使用 CFG 技术提升了控制信号响应的鲁棒性。

简单总结一下,Matrix-Game 经过了数千小时高质量数据的训练,通过创新的模型架构既实现了对人类交互动作的准确反应,又能保持生成内容的一致连贯,进而实现了从图像到世界生成的突破。

技术发展到这种程度,世界模型在快速生成游戏、动态视频生成等应用上已经让人看到了希望。

昆仑万维的空间智能愿景

远不止游戏

走向多模态、3D 世界,是生成式 AI 的下一个发展大方向。

在去年的一个演讲中,斯坦福大学教授李飞飞曾指出,过去几十年,尤其是深度学习变革的十多年里,我们在视觉智能方面取得了巨大进步,但目前的视觉智能仍存在局限,主要集中在二维图像的识别和理解。而现实世界是三维的,要真正解决视觉问题,并将其与行动联系起来,就必须发展空间智能。

空间智能是朝着全面智能迈出的一个基本且关键的步骤。只有让机器具备空间智能,才能使其更好地理解三维世界,从而实现更复杂、更高级的智能。

昆仑万维的 Matrix-Game 是空间智能领域交互式世界生成的重要里程碑,将为多个领域的发展带来重要影响。

首先,从内容生产的角度来看,Matrix-Game 可以支持更低成本、更高自由度的丰富、可控的游戏地图与任务环境生成,助力游戏开发。

此外,它还可以与昆仑万维的其他 AI 产品联动,比如天工大模型能为 Matrix-Game 生成的游戏世界提供更智能的 NPC 交互逻辑;Mureka 能为这些动态生成的场景和视频提供匹配的背景音乐和音效;SkyReels 可以为生成的游戏提供更多画面和剧情。这些产品就像一块一块的拼图,一旦整合到一起,能助力的不止是游戏生产,还有影视、广告、XR 等内容的生产。

其次,从科研角度来看,Matrix-Game 所代表的空间智能是一个极具潜力的方向,因为它和具身智能等方向的发展息息相关,谷歌、微软等大玩家都在此方向发力。Matrix-Game 作为中国首批具备可交互视频生成能力的世界模型,对于推动国内空间智能领域发展有重要意义 。 

「实现通用人工智能,让每个人更好地塑造和表达自我」,这是昆仑万维的使命。 这个使命在空间智能时代有了更深远的意义。当人类能在三维世界中自由创造和交互,当想象力不再受制于技术门槛,我们才真正开启了表达自我的新维度。 

过去半年多时间,昆仑万维在奖励模型、多模态、推理、视频生成等方向开源了一系列 SOTA 级别模型,如今又在空间智能方向再下一城。可以说,从二维到三维,从语言大模型到多模态生成再到如今的交互式世界模型,昆仑万维的技术布局越来越清晰:构建一个完整的 AI 创作生态。在这个生态中,每个人都能找到自己的创新空间,每个创意都有机会快速变成产品。一个想象力真正成为生产力的时代正在加速到来。

#xxx
#xxx
#xxx
#xxx
#xxx
#xxx
#xxx
#xxx
#xxx

相关文章:

51c大模型~合集127

我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架构 图解Vllm V1系列2 本文详细介绍了vllm v1的Executor-Workers架构&#xff0c;包括Executor的四种类型&#xff08;mp、ray、uni、external_launcher&#xff09;及其适用场景&#xff…...

Spring急速入门

Spring 是 企业级开发的一站式框架&#xff0c;核心是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09; 一、Spring 核心&#xff1a;IOC 理论 1. 什么是 IOC&#xff1f; IOC&#xff08;Inversion of Control&#xff0c;控制反转&…...

#在 CentOS 7 中手动编译安装软件操作及原理

在 CentOS 7 中&#xff0c;手动编译安装软件&#xff08;即从源代码编译安装&#xff09;是一种高度灵活的方式&#xff0c;适用于需要定制化软件功能、优化性能或安装官方仓库未提供的软件版本的场景。以下是针对手动编译安装的详细说明&#xff0c;包括原理、步骤、注意事项…...

【Kubernetes】初识基础理论(第一篇)

前言 单机容器编排&#xff1a; docker-compose 容器集群编排&#xff1a; docker swarm、mesosmarathon、kubernetes 应用编排&#xff1a; ansible 一、Kubernetes概述 Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的…...

配置集群(yarn)

在配置 YARN 集群前&#xff0c;要先完成以下准备工作&#xff1a; 集群环境规划&#xff1a;明确各节点的角色&#xff0c;如 ResourceManager、NodeManager 等。网络环境搭建&#xff1a;保证各个节点之间能够通过网络互通。时间同步设置&#xff1a;安装 NTP 服务&#xff0…...

按钮导航组件 | 纯血鸿蒙组件库AUI

摘要&#xff1a; 按钮导航组件(A_ButtonNav)&#xff1a;可设置导航数据(含文本及路由)&#xff0c;可设置按钮颜色、导航标题及导航子标题。 一、组件调用方式 1.1.极简调用&#xff1a; 用 A_ButtonNav 调用“按钮导航组件”&#xff0c;只需要给属性 data &#xff08;导…...

自适应主从复制模拟器的构建与研究

自适应主从复制模拟器的构建与研究 摘要: 本文旨在构建一个自适应主从复制模拟器,深入研究主从复制原理及优化方法。从研究者视角出发,详细阐述模拟器的设计、实现与实验过程,通过表格、图表及代码等辅助手段,逐步探讨如何在不同网络条件和负载下,自动调整主从复制参数和…...

015枚举之滑动窗口——算法备赛

滑动窗口 最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 原题链接 思路分析 见代码注解 代码 int maxSubArray(vector<int>& num…...

【Dv3Admin】工具视图配置文件解析

在开发后台管理系统时,处理复杂的 CRUD 操作是常见的需求。Django Rest Framework(DRF)通过 ModelViewSet 提供了基础的增删改查功能,但在实际应用中,往往需要扩展更多的功能,如批量操作、权限控制、查询优化等。dvadmin/utils/viewset.py 模块通过继承并扩展 ModelViewS…...

在MyBatis Plus里处理LocalDateTime类型

在MyBatis Plus里处理LocalDateTime类型 在MyBatis Plus里处理LocalDateTime类型时&#xff0c;你要确保数据库字段和Java实体类属性之间的类型映射是正确的。下面为你介绍处理这种情况的方法&#xff1a; 1. 数据库字段类型对应设置 要保证数据库字段类型和LocalDateTime相…...

编程技能:字符串函数03,strncpy

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数02&#xff0c;strcpy 回到目录…...

edge设置位IE模式打开网页

打开Edge浏览器->在浏览器工具栏右键->自定义工具栏->外观->选择要在工具栏上显示的按钮->找到“Internet Explorer 模式”按钮->开启,将其添加到工具栏中...

代码随想录训练营第二十二天| 101.对称二叉树 100.相同的树

101.对称二叉树&#xff1a; 文档讲解&#xff1a;代码随想录|101.对称二叉树 视频讲解&#xff1a;新学期要从学习二叉树开始&#xff01; | LeetCode&#xff1a;101. 对称二叉树_哔哩哔哩_bilibili 状态&#xff1a;已做出 思路&#xff1a; 这道题目我初始做的时候想着使用…...

nvm管理node版本

To manage Node.js versions on Windows, I recommend using nvm-windows (Node Version Manager for Windows). Here’s how we can handle this: First, let’s install nvm-windows. I’ll propose a command to check if it’s already installed: nvm versionGreat! I s…...

智能手表测试计划文档(软/硬件)

&#x1f4c4; 智能手表测试计划文档&#xff08;软/硬件&#xff09; 项目名称&#xff1a;Aurora Watch S1 文档编号&#xff1a;AW-S1-QA-TP-001 编制日期&#xff1a;2025-xx-xx 版本&#xff1a;V1.0 编写人&#xff1a;xxx&#xff08;测试主管&#xff09; 一、测试目标…...

基于大模型的原发性醛固酮增多症全流程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与方法 二、原发性醛固酮增多症概述 2.1 疾病定义与发病机制 2.2 临床表现与诊断标准 2.3 流行病学特征 三、大模型预测原理与技术 3.1 大模型简介 3.2 预测原理与算法 3.3 数据收集与预处理 四…...

spring中的@Lazy注解详解

一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具&#xff0c;通过将 Bean 的创建推迟到首次使用时&#xff0c;优化资源利用和启动性能。其核心功能包括&#xff1a; 延迟初始化 默认情况下&#xff0c;Spring 在容器启动时立即初始化所有单例 …...

Docker快速入门与应用

1. 什么是 Docker&#xff1f; Docker 就像一个“魔法箱子”&#xff0c;可以把你开发的应用&#xff08;代码、环境、配置&#xff09;‌打包成一个标准化的容器‌&#xff0c;这个容器可以在任何支持 Docker 的系统上运行&#xff0c;无需担心环境差异导致的问题。 ‌类比‌…...

判断一个数是不是素数的最高效的算法

判断一个数是否是素数&#xff0c;有从简单到复杂多种方法。最高效的算法取决于输入规模&#xff08;是几个亿以内的数&#xff0c;还是上百位的大整数&#xff09;&#xff0c;我会按实用场景分类讲解&#xff1a; ✅ 常规范围内&#xff08;比如 ≤ 1e12&#xff09;判断素数…...

《Head First 设计模式》第一章 - 笔记

本书是本人写的设计模式的笔记&#xff0c;写下核心要点&#xff0c;如果你掌握过设计模式&#xff0c;想快速阅读本书内容&#xff0c;这个笔记适合你阅读。如果你是新手&#xff0c;有 java 基础和 oo 设计原则基础&#xff0c;你适合跟我一样从零阅读本书。 第一章 策略模式…...

GPT系列:自然语言处理的演进与多模态的探索

GPT系列&#xff1a;自然语言处理的演进与多模态的探索 GPT系列的发展一、GPT-1 &#xff1a;通过生成式的预训练改进自然语言GPT-1的动机做一个预训练模型的难点GPT-1的微调模式GPT-1的训练数据Bert 二、GPT-2语言模型是非监督的GPT-2的动机引入promptGPT-2模型架构的改变GPT-…...

Linux驱动:驱动编译流程了解

要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…...

【MySQL】数据库基础

目录 1.什么是数据库2.见一见数据库3.服务器、表、库之间的关系4.MySQL架构5.sql语句分类6.查看MySQL存储引擎6.1 查看存储引擎6.2 常见存储引擎对比 1.什么是数据库 概念&#xff1a;数据库一般是指&#xff0c;在磁盘或者内存中存储的特定结构组织的数据 – 将来在磁盘上存储…...

1.1 文章简介

前因后果链 行业需求 → 技能断层 → 课程设计响应 (高薪岗位要求数学基础) → (符号/公式理解困难) → (聚焦原理与应用) 行业驱动因素 • 前因&#xff1a;机器学习/AI等领域的高薪岗位激增&#xff0c;但数学能力成为主要门槛 • 关键矛盾&#xff1a;算法论文中的数学…...

laravel 中使用的pdf 扩展包 laravel-snappy(已解决中文乱码)

Centos7 安装 wkhtmltopdf 1、先查看系统是 32 位的还是 64 位的 uname -a2、通过 composer 安装 wkhtmltopdf 32位: $ composer require h4cc / wkhtmltopdf-i386 0.12.x $ composer require h4cc / wkhtmltoimage-i386 0.12.x 64位: $ composer require h4cc/wkhtmltopdf-…...

java反序列化commons-collections链6

cc链6&#xff0c;最好用的cc链&#xff0c;因为它不受jdk版本的限制和cc版本的限制&#xff0c;前半段很像urldns链&#xff0c;后半段是cc1链 先来看一下它的利用链 Gadget chain:java.io.ObjectInputStream.readObject()java.util.HashSet.readObject()java.util.HashMap.p…...

WebSocket的原理及QT示例

一.WebSocket 介绍 1.概述 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它在 2011 年被 IETF 定为标准 RFC 6455&#xff0c;并由 RFC7936 补充规范。与传统的 HTTP 协议不同&#xff0c;WebSocket 允许服务器和客户端之间进行实时、双向的数据传输&a…...

css 点击后改变样式

背景&#xff1a; 期望实现效果&#xff1a;鼠标点击之后&#xff0c;保持选中样式。 实现思路&#xff1a;在css样式中&#xff0c;:active 是一种伪类&#xff0c;用于表示用户当前正在与被选定的元素进行交互。当用户点击或按住鼠标时&#xff0c;元素将被激活&#xff0c;此…...

AI 在模仿历史语言方面面临挑战:大型语言模型在生成历史风格文本时的困境与研究进展

概述 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术在诸多领域展现出了强大的能力&#xff0c;但在处理历史语言这一特定任务时&#xff0c;却遭遇了不小的挑战。美国和加拿大的研究人员通过合作发现&#xff0c;像 ChatGPT 这样的大型语言模型&#x…...

C++.Windows图形

Windows图形 1. 基础知识1.1 Windows图形编程基础1.2 GDI与GDI1.3 窗口消息处理2.1 注册窗口类2.2 创建窗口2.3 显示窗口3.1 创建按钮3.2 按钮消息处理4.1 设置窗口透明度4.2 透明窗口示例5.1 使用区域创建异形窗口5.2 异形窗口示例6.1 GDI抗锯齿设置6.2 抗锯齿绘图示例7.1 Dir…...

【Vue3】使用vite创建Vue3工程、Vue3基本语法讲解

一、什么是Vite Vite是新一代前端构建工具&#xff0c;官网地址&#xff1a;Vite中文网&#xff0c;vite的优势如下&#xff1a; 轻量快速的热重载&#xff08;HMR&#xff09;&#xff0c;能实现极速的服务启动对TypeScript、JSX、CSS等支持开箱即用真正的按需编译&#xff…...

专题二:二叉树的深度优先搜索

以leetcode2331题为例 题目分析&#xff1a; 以第一个示例为例 算法原理分析&#xff1a; 从宏观角度&#xff0c;也就是我的算法之回溯的第一篇 我们发现我们在研究示例的时候&#xff0c;必须从下往上推 也就是我在研究一个结点是true还是false的时候&#xff0c;必须…...

Termius ssh连接服务器 vim打开的文件无法复制问题

你的问题是&#xff1a; • 在 Termius (macOS) SSH 连接到 VMware Ubuntu&#xff0c;使用 vim 打开 .cpp 文件时&#xff0c;可以复制文本&#xff1b; • 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 时&#xff0c;复制操作无效。 ⸻ &#x1f3af; 初步分析 复制…...

搭建大数据学习的平台

一、基础环境准备 1. 硬件配置 物理机&#xff1a;建议 16GB 内存以上&#xff0c;500GB 硬盘&#xff0c;多核 CPU虚拟机&#xff1a;至少 3 台&#xff08;1 主 2 从&#xff09;&#xff0c;每台 4GB 内存&#xff0c;50GB 硬盘 2. 操作系统 Ubuntu 20.04 LTS 或 CentOS…...

Matlab 模糊控制节水洗衣机模型

1、内容简介 Matlab 232-模糊控制节水洗衣机模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

如何找正常运行虚拟机

1.新建虚拟机。Linux centos7&#xff0c;给虚拟机改个名字不要放在c盘 2.安装操作系统。cd/dvd->2009.iso 启动虚拟机...

python二手书交易管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

使用本地部署的 LLaMA 3 模型进行中文对话生成

以下程序调用本地部署的 LLaMA3 模型进行多轮对话生成&#xff0c;通过 Hugging Face Transformers API 加载、预处理、生成并输出最终回答。 程序用的是 Chat 模型格式&#xff08;如 LLaMA3 Instruct 模型&#xff09;&#xff0c;遵循 ChatML 模板&#xff0c;并使用 apply…...

C++编程练习,认识面向对象权限,如何进行封装

#include <iostream> #include <string> using namespace std; /* 银行的账户是一个模板&#xff0c;是一个类&#xff0c;有存款人信息和账户额度&#xff0c;而具体的存款人视为一个对象&#xff0c; 一个对象不能私自修改账户额度&#xff0c;需要通过一个操作流…...

A Survey of Learning from Rewards:从训练到应用的全面剖析

A Survey of Learning from Rewards&#xff1a;从训练到应用的全面剖析 你知道大语言模型&#xff08;LLMs&#xff09;如何通过奖励学习变得更智能吗&#xff1f;这篇论文将带你深入探索。从克服预训练局限的新范式&#xff0c;到训练、推理各阶段的策略&#xff0c;再到广泛…...

电脑端音乐播放器推荐:提升你的听歌体验!

在快节奏的职场环境中&#xff0c;许多上班族都喜欢用音乐为工作时光增添色彩。今天要分享的这款音乐工具&#xff0c;或许能为你的办公时光带来意想不到的惊喜。 一、软件介绍-澎湃 澎湃音乐看似是个普通的播放器&#xff0c;实则藏着强大的资源整合能力。左侧功能栏清晰陈列着…...

小刚说C语言刷题—1149 - 回文数个数

1.题目描述 一个正整数&#xff0c;正读和反读都相同的数为回文数。 例如 22&#xff0c; 131&#xff0c; 2442 &#xff0c; 37073&#xff0c; 66&#xff0c;…… 所有 11位数都是回文数。 给出一个正整数 n &#xff08; 1≤n≤10000 &#xff09;&#xff0c;求出 1,2…...

基于SpringBoot的博客系统测试报告

一、编写目的 本报告为博客系统测试报告&#xff0c;本项目模拟了csdn&#xff0c;实现了包括了用户登录&#xff0c;发布博客文章&#xff0c;查看博客等功能。 二、项目背景 博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c…...

Koa知识框架

一、核心概念 1. 基本特点 由 Express 原班人马开发的下一代 Node.js Web 框架 基于中间件的洋葱圈模型 轻量级核心&#xff08;仅约 600 行代码&#xff09; 完全使用 async/await 异步流程控制 没有内置任何中间件&#xff0c;高度可定制 2. 核心对象 Application (Ko…...

React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题

React Native踩坑实录&#xff1a;解决NativeBase Radio组件在Android上的兼容性问题 问题背景 在最近的React Native项目开发中&#xff0c;我们的应用在iOS设备上运行良好&#xff0c;但当部署到Android设备时&#xff0c;进入语言设置和隐私设置页面后应用崩溃。我们遇到了…...

RCE联系

过滤 绕过空格 ● 进制绕过 题目练习 数字rce 使用$0执行bash&#xff0c;<<<将后面的字符串传递给左边的命令。 例如&#xff1a; <?php highlight_file(__FILE__); function waf($cmd) { $whiteList [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \\, \, $, <]; $cmd_ch…...

区块链大纲笔记

中心化出现的原因是由于网络的形成&#xff08;不然就孤立了&#xff0c;这显然不符合现实&#xff0c;如&#xff0c;社会&#xff0c;计算机网路&#xff09;&#xff0c;接着由于网络中结点能力一般不对等同时为了便于管理等一系列问题&#xff0c;导致中心化网络的出现。&a…...

SQL:JOIN 进阶

目录 JOIN 是什么&#xff1f; &#x1f539;OUTER JOIN&#xff08;外连接&#xff09; 外连接的分类 外连接与内连接的区别 &#x1f539;USING 子句 语法结构 和 ON 的对比 &#x1f4d8;USING 的内部逻辑 &#x1f9e9; 多个字段的 USING USING 的 SELECT 特性&a…...

SATA—Link层状态机

一、概述 Link层的状态机大致可以分为五类&#xff1a; 链路层空闲状态机通信异常处理状态机链路层发送状态机链路层接收状态机链路层电源管理下的状态机 二、链路层空闲状态机 链路层空闲状态机共包含两个状态L_IDLE、L_SyncEscape&#xff0c;每个状态下的处理机制与条状…...

12.2.2 allocator类

allocator类将分配内存空间、调用构造函数、调用析构函数、释放内存空间这4部分操作分开&#xff0c;全部交给程序员来执行&#xff0c;不像new和delete #include <iostream> #include <string>int main() {const int n 10;std::allocator<std::string> al…...