Author: C3P00

  • 揭秘LocalAI.io——打造智能化未来的引领者

    在这个飞速发展的数字化时代,人工智能正逐渐渗透到我们生活的方方面面。今天,我将向大家介绍一个引领人工智能领域的先锋——LocalAI.io。他们凭借着一系列独特的技术和创新理念,正为我们揭示一个更加智能化的未来。接下来,就让我们一起走进LocalAI.io的世界,看看他们是如何改变我们的生活吧!


    LocalAI.io是一个致力于推动人工智能技术创新的公司。他们通过开发一系列易于使用的工具和平台,降低了人工智能技术的门槛,让更多人能够轻松体验到智能科技的魅力。他们的产品覆盖了图像识别、自然语言处理、机器学习等多个领域,为我们带来了更便捷、更高效的智能服务。

    在图像识别方面,LocalAI.io研发出了一款名为“智图”的软件。它能够迅速识别出图片中的物体、人脸等信息,并对其进行精准分类。无论是照片管理、安防监控还是自动驾驶等领域,智图都能发挥出强大的作用。这让图像识别技术变得更加普及,为我们的生活带来了诸多便利。

    除了图像识别外,LocalAI.io还在自然语言处理领域取得了卓越成就。他们推出的“智语”平台,能够实现语音识别、文本生成、情感分析等功能。无论是智能家居、智能客服还是语音助手等应用场景,“智语”都能为用户提供高效、便捷的语音交互体验。

    在探寻未来科技的道路上,LocalAI.io从未止步。他们以创新的思维,不断推动着人工智能技术的进步。与此同时,他们还关注着技术的普及与应用,让更多人享受到科技带来的福祉。正是有了像LocalAI.io这样的企业,我们的世界正变得越来越智能化,越来越美好。希望在未来,他们能够继续发挥领导力,携手我们共创一个充满智慧与创造力的新时代。

  • 一步一步学习Penrose:创造美丽的数学图像

    大家好!欢迎来到这篇关于Penrose的博客文章。准备好开启创造美丽图像的旅程了吗?无论你是数学领域的专家,还是编程初学者,Penrose都可以为你提供一个友好的平台,让你轻松地创造出令人惊叹的图形。

    Penrose: 一个新的视角

    我们经常会用笔或者铅笔来画出我们理解的概念,让它们从抽象变为具体。那么在Penrose中,我们是如何创造图像的呢?让我们来看一个简单的例子。假设我们想要画出你家的物品,首先我们需要确定我们的领域,也就是你家中的所有物品。然后,我们列出所有我们想要在图像中展示的物体,这些物体在Penrose中被称为”物质”。例如,你的椅子就是你家中的一个特定的物体。

    接下来,我们需要找出这些物体之间的关系。比如,我们可以根据家中的植物每周需要浇水的次数来对它们进行分组,这样我们就可以得到一个关于植物的视觉集群图。然后,我们可以尝试使用不同的颜色、大小和组合来绘制图像,同一个概念可以用不同的风格来表现。

    用Penrose来创造美丽的图像

    Penrose的主要目标是从数学陈述中创建美丽的图像。如果一个椅子是房子中的一个物体,那么一个向量也可以是线性代数中的一个物体。使用Penrose,你可以构建任何你想要可视化的数学领域。

    要使用Penrose创建图像,我们需要在三个特定的文件中编写代码。首先,我们需要定义我们的物体领域,因为Penrose并不知道你的家中有什么,也不知道什么是椅子。除了定义你的领域中的物体类型,你还需要描述你的领域中可能的操作。其次,我们需要存储我们想要在图像中包含的特定物质,这样Penrose才知道具体要为你画什么。最后,我们需要定义我们想要用来可视化我们的物质的样式。

    这三个文件分别对应于:

    • .domain文件,定义特定领域的语言。
    • .substance文件,创建数学内容的物质。
    • .style文件,指定视觉表示的样式。

    在一般情况下,每一个图像都会有一个独特的.substance文件,包含了图像的特定实例,而.domain和.style文件可以应用到很多不同的图像中。

    现在,你已经准备好开始你的Penrose之旅,制作你的第一个Penrose图像了!在接下来的教程中,我们将会一步步教你如何创建包含两个集合的图像,如何描绘子集的概念,以及如何展示向量的加法。让我们一起来开启这个精彩的旅程吧!

  • 使用24GB消费级GPU进行20B LLMs的RLHF微调

    欢迎各位读者,今天我们要聊聊一件新鲜事。没错,就是在一台24GB的消费级GPU上,如何对20B参数的大型语言模型(LLM)进行RLHF(人工反馈强化学习)的微调。这个工作得益于我们的新工具——trl和peft的完美结合。让我们一起来探索这个新颖的微调方法,以及它如何变得更加容易实现。

    一、 LLMs & RLHF:AI领域的新星

    首先,让我们来了解一下大型语言模型(LLMs)和人工反馈强化学习(RLHF)。结合使用LLMs和RLHF,我们可以构建出像ChatGPT这样的强大AI系统。这个过程通常包括三个步骤:首先,我们在特定领域或语料库的指令和人类示例上微调预训练的LLM;然后,我们收集一个人工注释的数据集,训练一个奖励模型;最后,我们用奖励模型和这个数据集使用RL(比如PPO)进一步微调第一步中的LLM。

    二、 什么是TRL?

    trl库的目标是使RL步骤更容易和更灵活,任何人都可以在自定义的数据集和训练设置上使用RL微调他们的LM。你可以使用trl来运行最流行的深度RL算法,PPO,这可以在分布式方式或单一设备上实现!为了实现这一目标,我们利用了Hugging Face生态系统中的accelerate工具,以便任何用户都可以扩大实验规模。

    三、 大规模训练的挑战

    大规模训练可能会遇到挑战。首要挑战是将模型及其优化器状态装入可用的GPU设备。一个参数在GPU内存中所占的空间取决于其”精度”(或者更具体地说,dtype)。最常见的dtype包括float32(32位),float16和bfloat16(16位)。简单来说,要在GPU设备上加载一个模型,每十亿个参数在float32精度下需要4GB的内存,在float16下需要2GB,而在int8下需要1GB。

    四、 8位矩阵乘法

    8位矩阵乘法是一种高效的方法,首次在论文LLM.int8()中提出,旨在解决量化大规模模型时性能下降的问题。简单地说,如果你使用8位矩阵乘法,你可以将全精度模型的大小减少4倍(因此,对于半精度模型,可以减少2倍)。

    五、 低秩适应和PEFT

    在2021年的论文LoRA: Low-Rank Adaption of Large Language Models中,研究者们证明了可以通过冻结预训练的权重并创建低秩版本的注意力矩阵的查询和值层,对大型语言模型进行微调。这种技术使LLMs的微调只需要一小部分的内存需求。

    六、 什么是PEFT?

    参数高效微调(PEFT)是一个由Hugging Face创建的库,用于支持在LLMs上创建和微调适配器层。peft已经无缝地集成了Accelerate,可以利用DeepSpeed和Big Model Inference对大规模模型进行扩展。

    七、 20B参数模型的低秩适配器微调

    那么,现在让我们来具体谈谈如何在24GB的消费级GPU上对20B参数的LLM进行微调。我们通过使用TRL库,可以在个人的数据集和训练设置中用RL微调LM。TRL库使用Hugging Face生态系统的accelerate工具,使得任何用户都可以将实验规模扩大到有趣的范围。

    而在大规模训练中,首要的挑战是如何将模型及其优化器状态装入可用的GPU设备。一种有效的解决方案是使用8位矩阵乘法,这种方法能够减少全精度模型的大小,从而使其适应硬件资源。

    同时,我们引入了低秩适应和PEFT技术。低秩适应是一种可以通过冻结预训练的权重并创建低秩版本的注意力矩阵的查询和值层,对大型语言模型进行微调的技术。这种技术使LLMs的微调只需要一小部分的内存需求。而PEFT(参数高效微调)则是一个由Hugging Face创建的库,用于支持在LLMs上创建和微调适配器层。

    这样,我们就可以在24GB的消费级GPU上进行20B参数模型的低秩适配器微调了。这个过程中,我们使用了trl和peft的集成,使得大型语言模型的微调变得更加容易实现,也更适应于硬件资源。

    总的来说,我们现在有了更多的工具和方法来更有效地微调大型语言模型,这将使得AI系统,如ChatGPT,变得更加强大和实用。这是一次令人兴奋的进步,也预示着AI技术将带来更多的可能性。

  • 将艺术赋予控制力:探索ControlNet在Diffusers中的应用

    大家好,我来给大家介绍一项令人兴奋的技术——ControlNet。这项技术为我们提供了一种全新的方法,让我们能够在图像生成过程中拥有更大的控制权。那么,ControlNet究竟是什么呢?又能带给我们怎样的可能性呢?接下来,让我们一起揭开ControlNet的神秘面纱。

    ControlNet简介

    ControlNet是由张璐民和Maneesh Agrawala在其研究成果“Adding Conditional Control to Text-to-Image Diffusion Models”中提出的一种框架。它提供了一种支持各种空间上下文的方法,这些上下文可以作为Diffusion模型(如Stable Diffusion)的额外条件。让我们通过一些例子来看看ControlNet的强大之处。

    想象一下,你有一个卡通图案,你想将它转化成一张逼真的照片,或者你有一个室内设计的草图,你希望看看它在现实中的效果。这些都可以通过ControlNet来实现。你甚至可以让一些著名的标志图案栩栩如生。ControlNet的应用极限只在于你的想象力。

    ControlNet的工作原理

    那么,ControlNet是如何工作的呢?首先,我们复制一个Diffusion模型(例如Stable Diffusion)的预训练参数,并将其称为“可训练副本”,同时也保留预训练参数的另一份副本,称为“锁定副本”。”可训练副本”用于学习任务特定的内容,而”锁定副本”则用于保留大数据集中学习到的丰富知识。然后,通过优化为ControlNet框架设计的“零卷积”层,将两份参数连接起来。这是一种训练技巧,可以在训练新条件时保留模型已经学到的语义。

    体验ControlNet

    接下来,让我们亲自体验一下ControlNet。首先,我们需要确保已经安装了所有必要的库。我们还需要安装一些额外的依赖项,以便处理不同的ControlNet条件。

    准备好之后,我们就可以开始了。我们选择了一幅著名的画作——《戴珍珠耳环的少女》作为例子。首先,我们将图像进行Canny预处理,这实际上是一个边缘检测的过程。

    之后,我们加载预训练的模型,并将模型设置为半精度(torch.dtype),以便进行快速且内存高效的推理。在加载模型时,我们还使用了一个叫做UniPCMultistepScheduler的调度器,它能大幅减少推理时间。

    接下来,我们将管道设置为开启智能CPU卸载,并启用FlashAttention/xformers注意力层加速,以节省内存消耗并提高推理速度。

    准备工作完成后,我们就可以开始运行ControlNet管道了!我们以“Sandra Oh,最高质量,极其详细”为提示,生成了一系列惊人的图像。其中,我们还可以看到一些现代名人仿照17世纪的这幅画作进行摆拍的图像。

    结语

    ControlNet技术为我们提供了一个全新的创作方式,让我们能够在生成过程中拥有更多的控制权。我们期待着看到更多的创新应用和独特创作。感谢你的阅读,我们下次再见!

  • Cython并行编程:揭秘Cython并行模块

    欢迎各位读者,我们今天将要探索的主题是Cython的并行编程功能。如果你是一名Python开发者,对于如何提升代码运行效率感兴趣,那么本文定会让你大开眼界。Cython是一个强大的工具,它能让Python代码运行得更快,而且还支持原生的并行化。今天,我们要深入探索的正是Cython 3版本的并行模块。

    Cython并行模块的使用需要明确两种语法:Cython专有的cdef语法和纯Python语法。这两种语法都能让我们在Python代码中使用C数据类型,只需要导入特殊的cython模块即可。值得注意的是,使用纯Python语法时,我们强烈推荐你使用最新的Cython 3版本。

    Cython通过cython.parallel模块支持原生并行化。要使用此类并行化,必须释放GIL(Python全局解释器锁)。目前,Cython支持OpenMP,未来可能会支持更多后端。

    并行循环:cython.parallel.prange()

    Cython提供了一个名为prange的函数,用于并行循环开发。prange函数会自动启动一个线程池,并根据设定的调度策略分配工作。它的使用方式与Python的range函数相似,但是提供了更多功能,包括线程局部变量、变量归约和私有变量。以下是两个简单的例子,一个使用纯Python语法,一个使用Cython语法:

    from cython.parallel import prange
    
    i = cython.declare(cython.int)
    n = cython.declare(cython.int, 30)
    sum = cython.declare(cython.int, 0)
    
    for i in prange(n, nogil=True):
        sum += i
    from cython.parallel import prange
    
    cdef int i
    cdef int n = 30
    cdef int sum = 0
    
    for i in prange(n, nogil=True):
        sum += i

    并行区域:cython.parallel.parallel()

    Cython还提供了parallel指令,它可以用在with语句中,以并行方式执行代码序列。这在设置prange中用于线程局部缓冲区的情况下非常有用。下面的例子展示了如何使用线程局部缓冲区:

    from cython.parallel import parallel, prange
    from cython.cimports.libc.stdlib import abort, malloc, free
    
    @cython.nogil
    @cython.cfunc
    def func(buf: cython.p_int) -> cython.void:
        pass
        # ...
    
    idx = cython.declare(cython.Py_ssize_t)
    i = cython.declare(cython.Py_ssize_t)
    j = cython.declare(cython.Py_ssize_t)
    n = cython.declare(cython.Py_ssize_t, 100)
    local_buf = cython.declare(p_int)
    size = cython.declare(cython.size_t, 10)
    
    with cython.nogil, parallel():
        local_buf: cython.p_int = cython.cast(cython.p_int, malloc(cython.sizeof(cython.int) * size))
        if local_buf is cython.NULL:
            abort()
    
        # populate our local buffer in a sequential loop
        for i in range(size):
            local_buf[i] = i * 2
    
        # share the work using the thread-local buffer(s)
        for j in prange(n, schedule='guided'):
            func(local_buf)
    
        free(local_buf)

    获取线程ID:cython.parallel.threadid()

    Cython并行模块还提供了threadid函数,用于获取当前线程的ID。对于n个线程,ID将从0到n-1。

    编译

    最后,要实# Cython并行编程:揭秘Cython 3.0.5并行模块

    欢迎来到我们今天的故事,我要带你一起探索一个神秘的领域——Cython的并行编程。如果你是Python的忠实粉丝,对如何提升Python代码运行效率的问题抱有热切的兴趣,那么这篇文章一定不会让你失望。接下来,我们要深入探讨的是Cython 3.0.5版本的并行模块。

    首先,我们需要了解Cython提供了两种语法:Cython专有的cdef语法和纯Python语法。这两种语法都能让我们在Python代码中使用C数据类型,只需要导入特殊的cython模块即可。如果你选择使用纯Python语法,强烈推荐你使用最近的Cython 3版本,这样你将会体验到更多的改进和优化。

    Cython通过cython.parallel模块支持原生的并行化。要使用这种并行化,必须释放GIL(Python全局解释器锁)。目前,Cython支持OpenMP,并且未来可能会支持更多的后端。

    轻松实现并行循环:cython.parallel.prange()

    Cython提供了一个名为prange的函数,用于并行循环开发。当你使用prange时,OpenMP会自动启动一个线程池,并按照你设定的调度策略分配工作。这个函数的参数与Python的range函数相似,但提供了更多的功能,包括线程局部变量和归约,以及最后的私有变量。你可以把prange看作是一个更强大、更灵活的range

    并行区域:cython.parallel.parallel()

    除了prange,Cython还提供了parallel函数,它允许你在一个指定的代码块中并行执行多个任务。这在你需要在prange的循环体中使用线程局部缓冲区的场景中特别有用。

    获取线程ID:cython.parallel.threadid()

    在一些情况下,你可能需要知道当前执行的是哪一个线程。Cython并行模块提供了threadid函数,你可以通过它获取当前线程的ID。

    Cython的并行编程功能为Python开发者提供了一个强大的工具,让Python代码能够更好地利用多核处理器的计算能力。这样不仅能提高代码的执行效率,还能在处理大数据或者复杂计算任务时,带来更好的用户体验。

    这就是我们今天要分享的内容,感谢你的阅读,希望这篇文章对你有所帮助。在编程的世界中,我们应该始终保持好奇和热情,不断探索未知,并享受其中的乐趣!

  • 探索Zig:小巧而强大的编程语言

    你是否曾经对一门编程语言深入研究,却发现它的复杂性超出你的预期?你是否寻找过一种编程语言,既强大又灵活,同时又简单易懂?如果你的答案是肯定的,那么,让我来向你介绍一门称为Zig的语言,它可能正是你一直在寻找的那种语言。

    Zig是一种专注于优化和易用性的编程语言。与C++、D和Rust等其他编程语言相比,Zig提供了一种全新的编程体验,让你可以真正专注于编程,而不是花费无尽的时间去理解编程语言本身。

    Zig的主要特点

    简洁易懂

    Zig的语法简洁明了,全语法只有500行PEG文法文件。它没有隐藏的控制流,隐藏的内存分配,也没有预处理器和宏。这意味着如果Zig代码看起来没有跳转去调用一个函数,那么它就不会调用。这种清晰的语法规则极大地提高了代码的可读性和可维护性。

    性能与安全并重

    Zig提供了四种构建模式,你可以在编程时自由选择。这四种模式包括调试,释放安全,释放快速,和释放小。这为开发者提供了一种灵活的方式,可以在需要最大性能的地方禁用安全检查,而在其他地方保持代码的安全性。

    兼容C语言

    Zig不仅可以与C语言库无缝集成,而且还提供了一种编译C代码的方式。这使得Zig在处理跨平台编译时具有极高的效率。

    Zig的优势

    Zig的优势并不仅仅在于其简洁的语法和灵活的构建模式。还包括一些其他的特性,比如:

    • 顶级声明的顺序独立性:Zig的全局变量的初始化值在编译时被计算,无需考虑声明顺序。
    • 空指针的替代方案:Zig使用可选类型代替空指针,有效防止许多运行时异常。
    • 手动内存管理:Zig允许程序员自行管理内存,使其代码可以在各种环境中运行,如桌面应用、低延迟服务器、操作系统内核、嵌入式设备、实时软件等。

    Zig的设计目标是为了让你能尽可能地专注于自己的项目,而不是被编程语言本身的复杂性所困扰。如果你正在寻找一种小而强大,简洁而灵活的编程语言,那么Zig值得你一试。

  • 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 支持 ESM 和 CDN 模块,扩大了项目的适用范围。此外,它还增加了对 stdin 的支持,让开发者可以在 JavaScript 中对 stdout/stderr 进行缓存。同时,它还支持 <script type = "text/php"> 的方式运行 PHP 代码,让开发者可以在页面中直接使用 PHP。此外,php-wasm 还添加了对 iconv 和 html-tidy 的支持,提升了项目的兼容性。

    php-wasm 还具备了一些强大的功能,包括内置的 PHP 和取出输出的能力,以及在 web 和 node 中进行构建的能力。此外,它还提供了一种简洁的方式来打包文件,让开发者可以更方便地管理项目。最后,php-wasm 对 PHP 进行了更新,使其达到了 8.2.11 版本,并使用 Emscripten 3.1.43 进行构建,进一步提升了项目的性能。

    总的来说,php-wasm 项目以其独特的理念和强大的功能,为 PHP 开发者打开了全新的可能,让他们可以在浏览器中运行 PHP 代码,提供了一种全新的开发方式。

    如何使用 php-wasm?

    要使用 php-wasm,首先需要将 php-tags.js 脚本从 CDN 中引入。然后,就可以在页面中直接运行 PHP 代码了。例如,通过 <script type = "text/php"> 的方式,我们可以直接在页面中运行 <?php phpinfo(); ?>。此外,我们还可以通过 data- 属性来使用标准输入、输出和错误,只需将属性值设置为与标签匹配的选择器即可。

    php-wasm 还支持在 <script type = "text/php"> 标签以及其输入元素上使用 src 属性。例如,我们可以在 script 标签中引入一个 PHP 文件,并指定其输入和输出。

    结语

    php-wasm 项目为 PHP 开发者提供了一种全新的工作方式,让他们可以在浏览器中运行 PHP 代码,开拓了新的开发领域。项目的源代码托管在 GitHub 上,开放给全球的开发者,共同推动这个项目的进步。Sean Morris 的努力和创新,不仅让 PHP 开发者得到了更多的可能性,也让我们看到了开源社区的活力和创新。

  • Redis的BLPOP、BRPOPLPUSH 系列指令

    Redis 是一个高性能的键值对存储系统,它支持多种数据结构,包括字符串、列表、哈希、集合、有序集合等。这里我们来介绍一下 Redis 的 BLPOPBRPOPLPUSH 系列命令。

    BLPOP (Blocking Left POP)

    BLPOP 是一个阻塞的列表弹出操作。它是 LPOP 的阻塞版本,可以从列表的最左侧(头部)移除并获取一个元素。如果列表为空或不存在,BLPOP 命令将阻塞连接,直到等待的列表中有可弹出的元素或达到超时时间。其基本用法如下:

    BLPOP key1 key2 ... keyN timeout

    在这里,key1key2keyN 是你想要弹出元素的列表,timeout 是阻塞超时时间(单位是秒)。命令返回的是一个两元素的数组,第一个元素是被弹出元素所在的列表名,第二个元素是被弹出的元素。如果达到超时时间,命令将返回 nil

    BRPOPLPUSH (Blocking Right POP Left PUSH)

    BRPOPLPUSH 命令是 BRPOPLPUSH 的组合。它从一个列表的最右侧(尾部)移除元素,并将该元素添加到另一个列表的最左侧(头部)。如果源列表为空,该命令将阻塞连接,直到源列表中有可弹出的元素或达到超时时间。其基本用法如下:

    BRPOPLPUSH source destination timeout

    在这里,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 进行推理的例子:

    import torch
    from diffusers import AutoPipelineForText2Image
    from diffusers.pipelines.wuerstchen import DEFAULT_STAGE_C_TIMESTEPS
    
    pipeline = AutoPipelineForText2Image.from_pretrained("warp-ai/wuerstchen", torch_dtype=torch.float16).to("cuda")
    
    caption = "Anthropomorphic cat dressed as a firefighter"
    images = pipeline(
        caption,
        height=1024,
        width=1536,
        prior_timesteps=DEFAULT_STAGE_C_TIMESTEPS,
        prior_guidance_scale=4.0,
        num_images_per_prompt=4,
    ).images

    Würstchen 在 1024×1024 到 1536×1536 之间的图像分辨率上进行训练,同时我们也注意到,在 1024×2048 这样的分辨率上,Würstchen 也能产生很好的结果。我们还发现,Prior(第三阶段模型)能够非常快速地适应新的分辨率,因此在 2048×2048 的分辨率上进行微调应该是计算成本非常低的。

    此外,Würstchen 还提供了一些优化技术,包括使用 PyTorch 2 SDPA 加速注意力机制,为 Apple Silicon Mac 提供的 mps 设备支持,以及使用生成器进行可复现性优化等。

    在此,我们要感谢 Stability AI 提供的计算资源,使得我们能够训练出这样的模型,我们希望这项研究能够对更多的研究者和开发者带来帮助,提升他们在图像生成领域的工作效率。

    Würstchen 的所有检查点都可以在 Huggingface Hub 上查看。在那里,您可以找到多个检查点,以及未来的演示和模型权重。目前,Prior有三个检查点,Decoder有一个检查点。请在文档中查看检查点的解释,以及不同的 Prior 模型的用途。

    因为 Würstchen 完全集成在 Diffusers 中,所以它自带各种好处和优化。其中包括:

    • 自动使用 PyTorch 2 SDPA 加速的注意力机制。
    • 支持 xFormers 的 flash 注意力实现,如果你需要使用 PyTorch 1.x 而不是 2.x。
    • 模型卸载,将未使用的组件在不使用时移动到 CPU,这可以节省内存,而对性能影响微乎其微。
    • 顺序 CPU 卸载,适用于内存非常宝贵的情况。内存使用将被最小化,代价是推理速度较慢。
    • 使用 Comp 进行提示权重。

    在这里,我们的介绍就要结束了,但 Würstchen 的旅程才刚刚开始。这个新模型将在图片生成领域带来革命性影响,无论是在计算成本、效率还是在图像质量上,都有显著的提升。我们期待它在未来能够带给更多研究人员和开发者便利和启发。感谢大家的阅读,我们下次再见!