Zig编程语言:强大、简洁,又不失优雅

大家好,今天我们要来聊聊一个全新的通用编程语言:Zig。这是一款为了维护健壮、优化和可重用软件而设计的工具链。 Zig的设计理念 Zig力求简洁明了,让开发者可以将精力集中在调试应用程序上,而不是去理解复杂的语言知识。Zig没有隐藏的控制流,没有隐式的内存分配,也不使用预处理器或宏。这样一来,使用Zig编程,你总是清楚自己在做什么。 Zig的编译时间 (Comptime) Zig引入了一种全新的元编程方式,它基于编译时的代码执行和惰性求值。在Zig中,你可以在编译时调用任何函数,无需担心运行时开销。Zig的编译时间(Comptime)可以模拟目标架构,让你在编程时就能预见到在实际运行环境中的行为。 Zig的可维护性 Zig提供了一种优雅的方式来逐步改进你的C/C++/Zig代码库。你可以把Zig当作一个零依赖的C/C++编译器使用,它天生支持跨平台编译。通过zig build,你可以在所有平台上创建一致的开发环境。你甚至可以向C/C++项目中添加Zig编译单元,Zig默认启用了跨语言的链接时间优化。 Zig社区 Zig社区是去中心化的,任何人都可以自由地开始并维护自己的社区聚集地。没有所谓的“官方”或“非官方”,不过,每个聚集地都有自己的版主和规则。 Zig的主要开发工作在GitHub的Zig仓库进行,你可以在那里找到问题跟踪器和提案讨论。我们希望所有的贡献者都能遵守Zig的行为准则。 Zig软件基金会 Zig软件基金会(ZSF)是一个于2020年由Zig的创造者Andrew Kelley成立的非营利性公司。基金会的目标是支持Zig语言的发展。目前,ZSF能够以竞争性的待遇为少数核心贡献者提供薪酬。我们希望在未来能够扩大这个优惠,让更多的核心贡献者得到薪酬。ZSF主要靠捐款维持运营。 Zig的赞助者 我们的赞助者包括一些公司和个人。他们为Zig提供了直接的财务支持,使得Zig项目可以对开源社区负责,而不是对公司股东负责。我们感谢所有赞助Zig的人,尤其是那些每月捐款200美元或以上的赞助者。 希望你能从Zig中找到乐趣,让我们一起探索这个新的编程世界!

让PHP在浏览器上翱翔:Sean Morris 的 php-wasm 项目探索

你是否曾想过在浏览器中直接运行 PHP 代码?Sean Morris 带来的 php-wasm 项目就是为此而生。它将 PHP 引擎与 WebAssembly 结合,让 PHP 开发者能够在新的领域大展身手。这个项目的原始版本由 Oraoto 开发,Sean Morris 则对其进行了 ES6 和 Clang 的升级。让我们一起跟随这个项目的脚步,探索在浏览器中运行 PHP 的全新可能性。 项目简介:php-wasm php-wasm 是一个开源项目,其目标是在浏览器中运行 PHP 代码。项目的主体部分托管在 GitHub 上,采用 Apache-2.0 许可证进行开源。其核心思想是将 PHP 与 WebAssembly 结合,让 PHP 开发者可以更方便地开发前端应用。 在这里,我们可以看到 php-wasm 项目的主页以及相关的代码,包括了许多文件夹和文件。例如,bin 文件夹中保存的是一些可执行文件,而 dist 文件夹中则保存了项目的构建结果。在项目主页的下方,我们还可以看到项目的 README 文件,其中详细介绍了项目的目标、功能和使用方法。 php-wasm 的特色与功能 php-wasm 提供了一套完善的应用解决方案,让开发者可以在浏览器中运行 PHP 代码。项目的最新版本为 v0.0.8,秉承“准备起飞”的精神,带来了一系列新的功能和改进。 首先,php-wasm 支持 … Read more

Redis的BLPOP、BRPOPLPUSH 系列指令

Redis 是一个高性能的键值对存储系统,它支持多种数据结构,包括字符串、列表、哈希、集合、有序集合等。这里我们来介绍一下 Redis 的 BLPOP 和 BRPOPLPUSH 系列命令。 BLPOP (Blocking Left POP) BLPOP 是一个阻塞的列表弹出操作。它是 LPOP 的阻塞版本,可以从列表的最左侧(头部)移除并获取一个元素。如果列表为空或不存在,BLPOP 命令将阻塞连接,直到等待的列表中有可弹出的元素或达到超时时间。其基本用法如下: 在这里,key1,key2 到 keyN 是你想要弹出元素的列表,timeout 是阻塞超时时间(单位是秒)。命令返回的是一个两元素的数组,第一个元素是被弹出元素所在的列表名,第二个元素是被弹出的元素。如果达到超时时间,命令将返回 nil。 BRPOPLPUSH (Blocking Right POP Left PUSH) BRPOPLPUSH 命令是 BRPOP 和 LPUSH 的组合。它从一个列表的最右侧(尾部)移除元素,并将该元素添加到另一个列表的最左侧(头部)。如果源列表为空,该命令将阻塞连接,直到源列表中有可弹出的元素或达到超时时间。其基本用法如下: 在这里,source 是源列表,destination 是目标列表,timeout 是阻塞超时时间(单位是秒)。命令返回的是被弹出并推入目标列表的元素。如果达到超时时间,命令将返回 nil。 BRPOPLPUSH 命令是原子性的,这意味着即便是在多个客户端并发执行这个命令的情况下,也不会有竞态条件(race condition)的发生。这使得 BRPOPLPUSH 非常适合实现可靠的队列——即使在处理过程中发生了错误或者服务器崩溃,你也可以通过目标列表恢复数据。

Würstchen:引领图像生成的速度革新

大家好,今天我要给大家介绍一款名为 Würstchen 的新型图像生成模型。这款模型由 Hugging Face 公司开发,它是一种扩散模型,能够在高度压缩的图像潜在空间中进行文本条件操作。这项技术的优势在于能大大降低训练和推理的计算成本。以前我们在处理 1024×1024 的图像时,需要花费大量的计算资源,而现在,通过 Würstchen,我们可以用相当于 32×32 图像的资源来完成这项工作,这无疑是一个巨大的突破。 Würstchen 的设计新颖,实现了 42 倍的空间压缩,这在之前是无法想象的。它采用了两阶段压缩,我们称之为A阶段和B阶段。A阶段是一个 VQGAN,B阶段是一个扩散自编码器。A阶段和B阶段共同被称为解码器,因为它们将压缩后的图像解码回像素空间。还有一个第三阶段模型,称为 Prior,它在高度压缩的潜在空间中进行学习,这种训练需要的计算资源只是当前顶级模型的一小部分,同时也让推理变得更便宜、更快。 那么,为什么我们需要另一个文本到图像的模型呢?原因很简单,因为 Würstchen 非常快且高效。比起像 Stable Diffusion XL 这样的模型,Würstchen 可以更快地生成图像,同时使用的内存也更少。此外,Würstchen 的训练成本也大大降低,Würstchen v1 只需要 9,000 GPU 训练小时,而 Stable Diffusion 1.4 需要 150,000 GPU 训练小时。这意味着更多的组织可以训练这样的模型。 使用 Würstchen 也非常简单。您可以通过 Diffusers 库来使用它,下面是一个使用 AutoPipeline 进行推理的例子: Würstchen 在 1024×1024 到 1536×1536 之间的图像分辨率上进行训练,同时我们也注意到,在 1024×2048 这样的分辨率上,Würstchen 也能产生很好的结果。我们还发现,Prior(第三阶段模型)能够非常快速地适应新的分辨率,因此在 2048×2048 … Read more

进入3D高斯投影的奇妙世界:开创图形渲染新纪元

大家好,欢迎来到今天的科技博客,我要引领大家进入一个充满奇妙创新的世界——3D高斯投影。这是一种由《3D高斯投影用于实时辐射场渲染》一文描述的光栅化技术,它带来了摄影级别的实时场景渲染。 3D高斯投影到底是什么? 首先,让我们来揭开3D高斯投影的神秘面纱。它是一种光栅化技术,这意味着它将场景描述的数据绘制在屏幕上,如同计算机图形中的三角形光栅化一样。然而,这里的主角并不是三角形,而是高斯分布。每一个高斯分布都被一些参数所描述,包括它的位置(XYZ)、协方差(即它的拉伸或缩放,由3×3矩阵表示)、颜色(RGB)以及透明度(α)。在实际应用中,这些高斯分布会被同时绘制出来,从而形成了我们所看到的3D图像。 3D高斯投影的工作原理 接下来,我将为大家详细介绍一下3D高斯投影的全过程。 首先,通过利用Structure from Motion(SfM)方法,我们可以从一组图片中估算出一个点云。然后,这些点会被转换成高斯分布,这已经足够进行光栅化了。接下来,我们需要通过训练来学习一个可以产生高质量结果的表示。 在训练过程中,我们使用了类似于神经网络的随机梯度下降,但没有涉及到层的概念。训练步骤包括使用可微的高斯光栅化将高斯分布光栅化为图像,计算光栅化图像与真实图像之间的差异,根据损失调整高斯参数,并应用自动化的密集化和剪枝。这使得高斯分布能更好地适应细致的细节,同时剪除不必要的高斯分布。 作为光栅化技术,3D高斯投影的关键在于它的快速性和可微性。每一个高斯分布都会从摄像机的视角投影到2D空间,按深度排序,然后每个像素会依次迭代每个高斯分布,将它们混合在一起。 3D高斯投影的重要性 那么,为什么3D高斯投影会引起人们的广泛关注呢?答案很明显,它能实时渲染出高质量的场景。而且,它还有很多未知的可能性,例如是否可以进行动画渲染?是否可以进行反射渲染?是否可以在不依赖参考图像的情况下进行建模?此外,3D高斯投影对于很多AI研究领域,如Embodied AI,也可能带来深远的影响。 3D高斯投影和图形的未来 那么,3D高斯投影对图形的未来意味着什么呢?它的优点包括能快速地实时渲染出高质量的照片级别场景,并且训练过程也相对较快。然而,也存在一些缺点,比如它需要大量的视频内存(查看需要4GB,训练需要12GB),生成的场景文件大小也较大,达到1GB以上。此外,它与现有的渲染管线并不兼容,生成的场景是静态的,不能动态改变。 虽然3D高斯投影带来了一些挑战,但它的出现无疑是图形渲染领域的一大创新。它打开了一个全新的可能性,也许在不久的将来,我们将看到更多利用3D高斯投影的实时、高质量的渲染效果。 结语 在这篇博客中,我们对3D高斯投影进行了初步的探讨。这是一个既神秘又充满无限可能性的领域。虽然它目前还存在一些局限性,但我们相信,随着科研人员的不断探索和技术的不断进步,3D高斯投影将为未来的图形渲染开创全新的纪元。

以强化学习让生成模型更符合人类审美:DDPO与TRL的完美结合

亲爱的读者,你是否曾经想过,我们能否让人工智能生成的图片更符合人类的审美呢?今天,我们就要带你探索这个问题的答案。我们将介绍如何使用DDPO(Denoising Diffusion Policy Optimization)通过TRL(Transformers Library)微调稳定扩散模型,从而使AI生成的图像更符合人类的审美。这是一场充满挑战与创新的神经网络冒险之旅,让我们一起启程吧! 一、DDPO与微调扩散模型的优势 首先,我们必须理解的是,DDPO不是微调扩散模型的唯一方法,但它的优势却是显而易见的。以计算效率和准确性为首的一系列特点,使得DDPO成为了扩散模型微调的理想选择。相比于之前的方法,DDPO将去噪步骤视为一个多步马尔可夫决策过程(MDP),并在最终获得奖励。这种全新的方法,使得代理策略能够成为一个各向同性的高斯分布,而不是一个复杂的分布。因此,DDPO不仅提高了计算效率,还减少了误差的堆积,为我们提供了更精准的结果。 二、DDPO算法简述 DDPO算法主要使用了一种策略梯度方法,即近端策略优化(PPO)。在使用PPO的过程中,我们注意到,DDPO算法的独特之处主要体现在轨迹收集部分。为了更好地理解这个过程,我们提供了一个简单的流程图,帮助你理解DDPO在动作中的运作方式。 三、DDPO与RLHF:增强审美性的混合 了解了DDPO的工作原理后,我们会发现,将DDPO与RLHF(Reinforcement Learning from Human Feedback)结合起来,可以更有效地让模型的输出符合人类的审美。在这个过程中,我们首先使用预训练的扩散模型,然后收集人类偏好的数据并使用它来训练奖励模型,最后使用DDPO和奖励模型进行微调。这个过程不仅高效,而且结果非常令人满意,得到的图像更符合人类审美。 四、使用DDPO训练稳定扩散模型 让我们深入了解一下如何使用DDPO训练稳定扩散模型。首先,你需要具备一定的硬件条件,例如拥有一台A100 NVIDIA GPU。然后,安装trl库和其他一些必要的依赖。在设置完硬件和软件环境后,你就可以开始实际的训练过程了。 我们的训练过程主要使用了trl库中的DDPOTrainer和DDPOConfig类。我们提供了一个示例训练脚本,该脚本利用这两个类和一些默认参数,对预训练的稳定扩散模型进行微调。在训练过程中,我们使用了一种审美奖励模型,该模型的权重是从公开的HuggingFace仓库中读取的。因此,你不需要自己收集数据和训练审美奖励模型。 最后,我们通过python命令启动训练脚本,然后就可以看到训练过程的实时输出了。这个过程可能需要一些时间,所以请耐心等待。完成训练后,你就可以使用微调后的模型生成新的图像了。 五、总结 今天,我们一起探讨了如何使用DDPO通过TRL微调稳定扩散模型。在这个过程中,我们深入了解了DDPO的优势和工作原理,以及如何将其与RLHF结合起来,以便更好地使模型的输出符合人类的审美。我们还详细介绍了使用DDPO训练稳定扩散模型的具体步骤。

让人工智能向无穷无尽的流畅表达迈进 — 探索“注意力吸收器”

在我们日常的对话中,有没有想过让人工智能(AI)也能如人类一样自由流畅地进行长时间的交流?今天,我们将一同探索一种新的技术——“注意力吸收器”,它可能会引领我们走向这个目标。 为何我们需要“注意力吸收器”? 大规模语言模型(LLMs)近年来引领了聊天机器人和虚拟助手的技术进步,但是,它们也存在一些限制。这些限制主要体现在两个方面:视频随机存取内存(VRAM)的使用和流畅度的丧失。 当我们使用LLMs进行长时间的对话时,模型的VRAM使用会呈线性增长,这可能会导致设备的内存限制。另一方面,当输入的内容过长,模型的表达流畅度会明显下降,表现为生成无意义的字符,或者重复的词汇。为了解决这些问题,我们研究了一种名为“注意力吸收器”的方法。 窗口注意力:一种尝试解决方法 为了解决VRAM使用问题,我们可以尝试限制输入到LLM的令牌数量,这种方法被称为窗口注意力。 在实验中,我们将窗口大小设置为1024个令牌。结果显示,虽然这种方法可以保持内存的稳定使用,但是一旦超过窗口大小,模型的表达能力就会显著下降。 注意力吸收器:新的解决思路 2023年,Xiao等人发现,当应用窗口注意力时,模型在窗口中的第一个令牌被移除后,模型的流畅度立即下降。他们注意到,即使是语义上不重要的令牌,也会占据大量的注意力分数。他们将这些令牌称为“注意力吸收器”。 基于这个发现,他们提出了一种改进的窗口注意力方法,即在窗口中始终保留初始的四个令牌,也就是“注意力吸收器”。这种方法有效地解决了窗口注意力中的一个关键问题:当第一个令牌从窗口中移除时,模型无法将注意力分数转移到该令牌上,从而导致模型失去流畅度。 结论:注意力吸收器的威力 我们使用注意力吸收器进行了实验,结果显示,使用注意力吸收器的LLMs同时具备了稳定的空间复杂度和流畅的表达能力。这表明,使用注意力吸收器,我们的模型可以保持流畅的表达,直到我们的数据耗尽。 注意力吸收器让我们的AI更接近无穷无尽的流畅表达。尽管这仍然是一个新的领域,但我们希望这种方法能够推动AI技术的前进,为我们的日常生活带来更多的便利。 在未来,我们期待看到更多的研究者和开发者参与到这个领域中来,共同推动AI技术的发展,让我们的AI可以更好地理解我们,更好地服务我们。

解密大型语言模型的无尽流畅性:探索”注意力汇聚”现象

欢迎来到这个探索大型语言模型(LLMs)无尽流畅性的神奇旅程。在这篇文章中,我们将研究一种新的技术策略,即”注意力汇聚”,它在Hugging Face的博客中被详细介绍。这种策略对于改进LLMs,如所有Llama、Mistral、MPT、Falcon和GPT-NeoX(Pythia)模型的性能有着重要的影响。现在,让我们一起揭开这个神秘现象的面纱! LLMs的局限性:VRAM和流畅性问题 首先,我们需要理解LLMs在现实应用中面临的挑战。其中,最重要的两个问题是VRAM使用和流畅性的丧失。在聊天助手场景中,这意味着设备的VRAM限制将限制用户连续提问的能力。同时,所有至今为止训练过的LLMs在输入过长时都会遇到流畅性的丧失问题,这会导致模型生成的语言失去连贯性。 窗口注意力:一种尝试解决VRAM问题的方法 为了解决VRAM使用问题,我们可以尝试限制输入给LLMs的令牌数量,这就是”窗口注意力”的概念。然而,实验结果显示,这种方法并不能有效地解决问题。一旦生成的令牌数超过窗口大小,模型的复杂度会立即上升。 注意力汇聚:解决流畅性问题的新策略 好在,我们发现了一个新的解决策略:注意力汇聚。研究人员发现,在应用窗口注意力的过程中,LLMs为生成下一个令牌分配了大量的注意力分数给前几个令牌,即便这些令牌在语义上并不重要。因此,当第一个令牌从窗口中移除时,模型无法将注意力分数装载到该令牌上,导致模型“崩溃”并丧失流畅性。 为了解决这个问题,研究人员提出了一种改良的窗口注意力方法,它始终保留序列中的初始4个令牌,即注意力汇聚令牌。 注意力汇聚的实践效果 实验数据显示,使用注意力汇聚的LLMs在空间复杂性和困惑度上都表现出了稳定性。此外,按照这种方式,可以无限生成文本而不会出现模型流畅性的丧失。 结论 总的来说,注意力汇聚为我们提供了一种新的解决LLMs问题的方法:通过保留注意力汇聚令牌,我们可以避免模型在生成过程中失去流畅性,并保持恒定的VRAM使用。这种方法对于改进聊天助手、虚拟助手等基于LLMs的应用具有重要的实践价值。

【深度揭秘】StreamingLLM:大型语言模型的“无限长”生成能力

在今天的科技热点之旅中,我们要探讨的是一个源自语言模型领域的新词:StreamingLLM。这个强大的技术,旨在打破大型语言模型(LLM)在推理时只能记住有限上下文的限制。音乐会有无尽的旋律,那么,人工智能的语言模型是否也能拥有无尽的生成能力呢?让我们一起揭秘这个问题的答案。 1. LLM的限制:有限的上下文记忆 先让我们理解一下问题的背景。在现行的语言模型,如LLama2中,模型只能处理4K长度的上下文。这个限制导致了两个问题:一是模型无法记住超过最近4K上文的内容,二是当生成文本达到4K时,模型会自动停止。这在某种程度上限制了我们对AI对话助手的期望,我们希望它能不受输出长度的限制,并记住历史的对话。 2. StreamingLLM的提出:无限序列长度的输入和输出 然后,MIT,Meta AI,CMU的研究团队提出了一个全新的解决方案:StreamingLLM。他们声称,这种方法可以使得大型语言模型在无需任何微调的情况下,推广到无限序列长度的输入和输出。请注意,这个方法并没有增加LLM的对上文的记忆,只是让它输入输出无限长。这样的好处显而易见,例如,当你需要对话机器人生成一个很长的回答时,你不再需要输入“继续”。 3. StreamingLLM的核心技术:Attention Sink 那么,StreamingLLM是如何实现这个目标的呢?关键在于MIT韩松老师实验室的主要作者Guangxuan Xiao提出的一个名叫“Attention Sink”的技术。这个技术在处理Transformer推理时,解决了一些非常有趣的问题。他们的研究成果在学界得到了广泛的关注,并已经在github上开源。 4. StreamingLLM的解决挑战:处理无限输入的LLM StreamingLLM的目标是在不牺牲效率和性能的情况下,部署一个能处理无限输入的LLM。这样的模型可以不受长度限制不停地输出,具体效果可以参考他们的主页视频。然而,这并非易事,面临着诸多挑战。 一个挑战是在解码阶段,由于KV Cache的存在,会导致内存使用或延迟增加,而内存上线和推理服务SLA的存在,又使得KV Cache不能无限大,这构成了性能瓶颈。另一个挑战是现有模型的外推能力有限,当序列长度超过预训练时设定的注意力窗口大小时,它们的表现会下降,这是模型能力的瓶颈。 在面对这些挑战时,StreamingLLM通过使用近似注意力的方法,放松了对全部输入记忆的限制,仍然只记住最近的上下文,但实现了处理无限输入并获得无限输出的效果。 5. StreamingLLM的突破:Attention Sink StreamingLLM的另一项重大突破是他们提出了“attention sink”概念,这被认为是解决以上挑战的关键。简单来说,”attention sink”是一个技术,它将注意力集中在最近的上下文中,而非全部的上下文。这种方法大大节省了内存和计算资源,克服了KV Cache的限制,而且它使得模型可以处理无限长度的输入输出,这无疑是对现有模型的重大突破。 6. StreamingLLM的实践应用 StreamingLLM的实际应用非常广泛。比如在AI对话助手中,它可以生成无限长的对话,而且还能记住历史的对话。这对于长对话、长篇文章的生成,无疑提供了更好的用户体验。此外,StreamingLLM还可以应用于其他领域,比如在线翻译、自动问答、编程助手等等,无所不能。 7. StreamingLLM的未来 StreamingLLM的未来充满了可能。就像我们在音乐中能创作出无尽的旋律一样,StreamingLLM为我们的语言模型赋予了无尽的生成能力。我们期待,随着技术的进步,我们能解决更多的挑战,进一步提升模型的性能,让AI更好地服务于人类。 结语: StreamingLLM技术让我们看到了大型语言模型的无限可能。它打破了有限上下文的限制,开创了无限长的生成能力。这无疑为AI领域带来了新的机遇,也带来了新的挑战。我们期待更多的研究者和开发者加入到这个领域中来,共同推动人工智能的进步。 感谢您的阅读,希望我们的探讨对您有所帮助。在下一次的科技热点之旅中,我们会带来更多有趣的话题。再见!

ChatDev:改变编程的虚拟软件公司

作为程序员,您是否曾幻想整个软件开发过程能够自动完成,不再需要手动编码、测试、排错?现在,有一个开源项目正在实现这一梦想,那就是ChatDev。 ChatDev是一个虚拟的软件公司,由不同角色的智能语言模型组成,包括CEO、产品经理、技术总监、程序员、测试员等。这些智能角色形成一个多角色组织结构,共同推动软件项目的执行。他们可以通过文字交流来协作设计、编写、测试软件。 这样的设置使ChatDev具有以下优势: 1、操作简单,用户只需文字描述想要开发的软件即可,无需了解编程; 2、高度可自定义,可以自定义公司内部流程、角色等; 3、可扩展性强,可以轻松扩展新的角色和功能; 4、安全性高,基于Docker可以安全运行; 5、支持多种系统,包括Linux、MacOS、Windows。 使用ChatDev非常简单。先配置好OpenAI的API密钥,然后通过简单的命令就可以启动一个软件项目开发。在交互过程中,ChatDev会在后台自动编写代码、进行测试、生成文档等,最终交付一个可直接运行的软件包。 ChatDev还在不断完善中,已支持代码版本控制、人机交互等功能。用户甚至可以加入到这个虚拟团队中,与ChatDev的智能角色互动、提出建议。 ChatDev是一个开源项目,欢迎共建。如果您对自动编程、人工智能应用等感兴趣,欢迎加入ChatDev团队!通过自定义ChatDev,我们可以探索人工智能在软件工程等场景的应用潜力,共同开创编程方式的新未来。 项目地址:https://github.com/OpenBMB/ChatDev