月度归档: 2023 年 11 月

  • 创新解决大模型长上下文计算挑战:HyperAttention解读

    大家好,我相信你们在使用人工智能应用的过程中,一定对其中的语言处理功能印象深刻。它们可以帮助我们理解复杂的文本,生成文章甚至进行对话。但你可能不知道,这背后有一种重要的模型叫做“大型语言模型”。近日,一项名为“HyperAttention”的研究引起了我的注意,其主旨在于改善这些大型语言模型处理长篇文章时的效率。这个方法超越了既有技术限制,实现了近线性时间的长文本处理。听起来是不是很神奇?接下来,让我们一起深入了解一下。

    首先,我们需要明白一点,就是处理长上下文的计算挑战。大型语言模型(LLMs)在处理长文本时,必须应对着一个诸多复杂因素的大矩阵,这个矩阵的计算和存储需求都是巨大的。就像你试图一口气读完一本厚厚的百科全书,不仅费时费力,还需要巨大的记忆力。这就是大型语言模型面临的挑战。

    为了迎接这个挑战,研究人员提出了一种新颖的近似注意力机制,被命名为“HyperAttention”。这个方法的核心是引入了两个参数,用来衡量矩阵的复杂度。并且,HyperAttention的设计非常模块化,易于与其他快速低水平实现进行整合,特别是FlashAttention。根据实验结果,HyperAttention在处理长篇章数据集时,表现出了显著的速度优势。

    研究者们用一个例子来证明这种优势:在一个名为ChatGLM的模型中,使用HyperAttention后,处理长达32k的文本所需的时间减少了50%,而生成的文本复杂度只是从5.6提高到6.3。当处理更长的文本,例如长度为131k的文本时,HyperAttention甚至能在单个注意力层上提供5倍的速度提升。

    HyperAttention的出现,不仅解决了大型语言模型处理长文本时的速度问题,还开启了新的研究方向。对于那些需要处理大量文本数据的应用,比如自动翻译、文章生成等,HyperAttention无疑将带来巨大的改变。

  • HyperAttention:长上下文友好、LLM推理提速50%

    大家好,欢迎收听本期节目。今天,我们将一起走进 HyperAttention 的奇妙世界,了解这种全新近似注意力机制如何让大型语言模型在长上下文下也能飞速推理。

    什么是 HyperAttention?

    HyperAttention 是一种近似注意力机制,它可以显著提升大型语言模型在长上下文下的推理速度。传统的注意力机制在计算时需要遍历整个输入序列,这使得计算成本非常高。而 HyperAttention 则通过对注意力矩阵进行近似,从而大幅降低计算成本。

    HyperAttention 的工作原理

    HyperAttention 的工作原理并不复杂。它首先会对注意力矩阵进行分解,然后对每个子矩阵进行近似。最后,将所有子矩阵的近似结果组合起来,得到最终的注意力矩阵。

    HyperAttention 的优势

    HyperAttention 的优势非常明显。它可以显著提升大型语言模型在长上下文下的推理速度,同时还能保持较高的准确率。在某些情况下,HyperAttention 甚至可以将推理速度提升 50% 以上。

    HyperAttention 的应用

    HyperAttention 可以广泛应用于各种自然语言处理任务,如机器翻译、问答系统、文本摘要等。它可以帮助这些任务在处理长上下文数据时获得更高的效率和准确率。

    HyperAttention 的未来

    HyperAttention 是一种非常有潜力的近似注意力机制,它有望在未来得到更广泛的应用。随着研究的不断深入,HyperAttention 的性能还将进一步提升,从而为大型语言模型的应用开辟新的可能性。

  • 《机器学习实战中文版》带你轻松入门机器学习

    AAAMLP 中译版 (ytzfhqs.github.io)

    大家好,欢迎收听本期播客。今天,我们将介绍一本关于机器学习的书籍:《机器学习实战中文版》。

    《机器学习实战》介绍

    《机器学习实战》是由Abhishek Thakur所著的一本关于机器学习的书籍。Abhishek Thakur是挪威boost公司首席数据科学家,在Kaggle上取得过辉煌的成绩。

    这本书的英文原版于2017年出版,一经推出便受到了广大读者的喜爱。中文版由电子工业出版社出版,于2023年9月正式上市。

    《机器学习实战》的内容

    《机器学习实战》共12章,内容涵盖了机器学习的基础知识、算法、实战技巧等。

    前4章介绍了机器学习的基础知识,包括准备环境、有监督和无监督学习、交叉检验和评估指标。

    第5章到第10章介绍了机器学习的各种算法,包括处理分类变量、特征工程、特征选择、超参数优化、图像分类和分割方法、文本分类或回归方法。

    最后2章介绍了机器学习的实战技巧,包括组合和堆叠方法、可重复代码和模型方法。

    《机器学习实战》的特点

    《机器学习实战》的特点是内容全面、深入浅出、实战性强。

    • 内容全面:本书涵盖了机器学习的基础知识、算法、实战技巧等各个方面,是一本全面的机器学习教程。
    • 深入浅出:本书的语言通俗易懂,即使是没有任何机器学习基础的读者也能轻松入门。
    • 实战性强:本书提供了大量的代码示例,读者可以边学边练,快速掌握机器学习的实战技巧。

    《机器学习实战》的意义

    《机器学习实战》是一本非常适合机器学习初学者阅读的书籍。它内容全面、深入浅出、实战性强,能够帮助读者快速入门机器学习。

    如果你想学习机器学习,那么《机器学习实战》绝对是你不容错过的书籍。

    结语

    好了,以上就是本期播客的内容。感谢您的收听。我们下期再见。

    ytzfhqs/AAAMLP-CN: Approaching (Almost) Any Machine Learning Problem中译版,在线文档地址:https://ytzfhqs.github.io/AAAMLP-CN/

  • “PrivateGPT”:您的私人文档助手

    大家好,今天,我们要向大家介绍的是一款非常实用的AI工具——“PrivateGPT”。它可以帮助您以100%的私密性,利用大型语言模型(LLMs)的力量来处理您的文档。

    PrivateGPT的诞生

    “PrivateGPT”的诞生源于一个明确的需求:在当今社会,生成式AI技术正在飞速发展,但由于隐私问题,许多公司和行业,比如医疗或法律领域,无法充分利用这项技术。

    PrivateGPT的优势

    “PrivateGPT”的优势在于,它完全离线运行,这意味着您的数据始终处于您的控制之下,不会泄露给任何第三方。

    PrivateGPT的功能

    “PrivateGPT”提供了一个API,包含了构建私有、语境感知AI应用程序所需的所有基本功能。它遵循并扩展了OpenAI的API标准,支持普通和流式响应。

    PrivateGPT的未来

    “PrivateGPT”正在不断发展,目标是成为生成式AI模型和原语的网关,包括补全、文档嵌入、RAG管道和其他低级构建块。

    如何使用PrivateGPT

    有关“PrivateGPT”的更多信息,包括安装、依赖项、配置、运行服务器、部署选项、嵌入本地文档、API详细信息和UI功能,请访问我们的官方文档网站。

    结语

    “PrivateGPT”是一款功能强大且易于使用的工具,可以帮助您以100%的私密性来处理您的文档。如果您正在寻找一种安全可靠的方式来利用生成式AI技术,那么“PrivateGPT”绝对是您的最佳选择。

  • 让 PHP 跑的更快

    1. HipHop Virtual Machine (HHVM)

    HHVM 是一个开源的 PHP 编译器,可以将 PHP 代码编译成字节码,然后由虚拟机执行。它可以显著提高 PHP 的执行速度,并且支持多种语言特性,例如类型检查和协程。

    2. Phalanger

    Phalanger 是一个将 PHP 编译成 .NET 程序集的编译器。它可以显著提高 PHP 的执行速度,并且支持多种语言特性,例如类型检查和泛型。

    3. Quercus

    Quercus 是一个将 PHP 编译成 Java 字节码的编译器。它可以显著提高 PHP 的执行速度,并且支持多种语言特性,例如类型检查和异常处理。

    4. Peachpie

    Peachpie 是一个将 PHP 编译成 C# 程序集的编译器。它可以显著提高 PHP 的执行速度,并且支持多种语言特性,例如类型检查和泛型。

    5. Swoole

    Swoole 是一个高性能的 PHP 协程库,可以显著提高 PHP 的并发能力。它支持多种语言特性,例如协程、事件驱动和非阻塞 I/O。

    这些编译工具可以帮助您提高 PHP 的执行速度,并且支持多种语言特性。您可以根据自己的需要选择合适的编译工具。

  • 人工智能的新篇章:从 RAG 到 Self-RAG

    欢迎来到这个关于人工智能进步的奇妙旅程!今天,让我们一起探索从 RAG (Retrieval Augmented Generation) 到 Self-RAG 的知识增强过程。这其中蕴含的深刻原理和广阔应用,将带你领略新一波 AI 风暴的来临。

    RAG:知识增强的先驱

    RAG,或称检索增强生成,是一种先进的机器学习技术。在回答问题或生成文本时,它会先从大量文档中检索出相关的信息,然后基于这些信息生成回答或文本,从而提高预测质量。这意味着开发者无需为每一个特定任务重新训练整个大模型,只需要接入知识库即可。

    RAG 对于知识密集型的任务尤为有用。那么,你可能会问,如果我们已经有了强大的语言模型(LLM),为什么还需要 RAG 呢?其实,RAG 主要解决了 LLM 所面临的三个问题:

    1. 幻觉问题:LLM 在生成文本时,有可能会产生“一本正经的胡说八道”的现象。
    2. 时效性问题:大模型训练的周期较长,因此无法处理具有时效性的数据,例如“帮我推荐几部正在热映的电影?”。
    3. 数据安全问题:通用的 LLM 无法使用企业内部数据和用户数据,因此企业在使用 LLM 时,需要将数据全部放在本地,保护数据安全。

    RAG 与 SFT:两者的比较

    那么,对于 LLM 的上述问题,我们是否有其他解决办法呢?SFT 确实是一种常见的解决方案,但是 RAG 和 SFT 在多个维度上都有各自的优点和弱点。例如,RAG 能够使用动态数据,并且能够利用外部资源增强 LLM 的能力。相较之下,SFT 更适合处理静态数据,它可以对 LLM 进行微调,但对于频繁变动的数据源来说可能不太实用。

    当然,RAG 和 SFT 并非非此即彼,合理的做法是根据业务需求,结合两者的优点进行使用。在这个过程中,我们也可以发现 RAG 具有以下优点:

    • 可扩展性:降低模型大小和训练成本,并允许轻松扩展知识。
    • 准确性:模型基于事实并减少幻觉。
    • 可控性:允许更新或定制知识。
    • 可解释性:检索到的项目作为模型预测中来源的参考。
    • 多功能性:RAG 可以针对多种任务进行微调和定制,包括 QA、文本摘要、对话系统等。

    RAG:实现步骤与应用案例

    RAG 的实现主要包括三个步骤:数据索引、检索和生成。而数据索引的构建又可以进一步分为数据提取、分块和向量化三个阶段。这些步骤中涉及到的数据处理、文本分块以及数据向量化等技术,都是人工智能领域的重要基础。

    让我们在这个令人兴奋的 AI 旅程中继续前进。通过 RAG,我们可以实现一系列应用,包括但不限于:

    • 问答系统:基于检索增强生成的问答系统可以从大量的知识库中找到最相关的答案,提供准确的信息。
    • 文本生成:利用 RAG,我们可以生成具有深度和广度的文章,丰富读者的阅读体验。
    • 对话系统:RAG 可以让对话系统更加智能,更好地理解和满足用户的需求。

    结语:向 Self-RAG 的未来

    RAG 无疑是一种强大的工具,但我们也看到了它的一些局限性。比如,它依赖于手动标注的知识库,且在遇到大量数据时,可能会面临检索效率低下的问题。因此,我们需要更进一步,探索如何实现自我增强的 RAG,即 Self-RAG。

    在这个正在快速发展的 AI 时代,一种新的技术或模型的出现,可能会引发一场革命。对于我们来说,最重要的是理解并掌握这些新技术,以便在未来的 AI 风暴中立于不败之地。

    这就是我们今天的内容,希望你能从中获得启发和收获。在人工智能的海洋中,让我们一起乘风破浪,探索更多的可能!

  • 人工智能的新篇章:从 RAG 到 Self-RAG

    你可能听说过人工智能、机器学习、深度学习等概念,但你知道 RAG(Retrieval Augmented Generation,检索增强生成)和 Self-RAG 吗?今天,我们就一起深入了解一下这两个新兴的人工智能领域概念。

    RAG:提升人工智能的知识增强能力

    RAG 是一种让大型语言模型 (LLM) 在回答问题或生成文本时,先从大量文档中检索出相关的信息,然后基于这些信息生成回答或文本的方法。这种方法提高了预测的质量,使得开发者不必为每一个特定的任务重新训练整个大型模型,只需要外挂上知识库,即可为模型提供额外的信息输入,提高其回答的准确性。RAG 模型尤其适合知识密集型的任务。

    然而,尽管 LLM 具有强大的能力,仍然存在一些问题需要 RAG 解决。例如,LLM 在生成文本时,可能会产生一些幻觉问题;大型模型的训练成本高,更新周期长,对于时效性强的数据处理能力有限;通用的 LLM 没有企业内部数据和用户数据,如何在保证数据安全的同时使用 LLM 成为了一个问题。

    RAG 与 SFT:两种方法的对比

    实际上,SFT(Supervised Fine-Tuning,监督微调)是解决 LLM 存在问题的另一种常见方法。比较起来,RAG 和 SFT 各有特长。RAG 适合动态数据,擅长利用外部资源,适用于知识密集型任务,而 SFT 可以对 LLM 进行微调以对齐预训练学到的外部知识,优于定制模型的行为或写作风格。两者并非相互排斥,而是可以根据业务需要,结合使用。

    RAG 的应用及挑战

    RAG 具有诸多优点,例如可扩展性、准确性、可控性、可解释性以及多功能性。例如,ChatPDF 就是一个典型的 RAG 应用案例,该系统首先读取 PDF 文件,将其转换为可处理的文本格式,然后对提取出来的文本进行清理和标准化。当用户提出问题时,ChatPDF 使用 OpenAI 的 Embeddings API 将问题转换为一个向量,并与每个分段的向量进行比较,以找到最相似的分段。最后,ChatPDF 会将 ChatGPT 生成的答案返回给用户,完成一次查询。

    然而,RAG 也面临一些挑战。例如,检索效果依赖 embedding 和检索算法,目前可能检索到无关信息,反而对输出有负面影响;大模型如何利用检索到的信息仍是黑盒的,可能仍存在不准确(甚至生成的文本与检索信息相冲突)。

    Self-RAG:主动智能的新篇章

    与 RAG 不同,Self-RAG 是更加主动和智能的实现方式。它会首先判断是否需要额外检索事实性信息,当有需要时才进行检索,并对检索到的所有任务进行评估,最后生成结果会引用相关片段,以便于查证事实。Self-RAG 的这种自我反思和主动检索的方式,有助于提高模型的准确性和可靠性。

    Self-RAG 的一个重要创新是反思字符,这些特殊标记用于检查模型的输出。它们分为 Retrieve 和 Critique 两种类型,用于判断是否需要检索更多信息,以及检索到的信息与输出之间的关系。

    训练 Self-RAG 的过程中,我们需要让模型学会生成带有反思字符的文本。这种训练过程需要在一个包含预测的检索段落和反思字符的语料库上进行。在训练结束后,我们得到的模型可以自我评估输出,并在推理过程中自我调整,以达到更精细的输出生成。

    一个简单的例子

    让我们来看一个 Self-RAG 的例子,帮助我们更好地理解其工作原理。我们假设有一个问题:”Can you tell me the difference between llamas and alpacas?”,以及一个检索到的段落:”The alpaca (Lama pacos) is a species of South American camelid mammal. It is similar to, and often confused with, the llama. Alpacas are considerably smaller than llamas, and unlike llamas, they were not bred to be working animals, but were bred specifically for their fiber.”。

    首先,我们把问题和段落作为提示输入到模型中,然后让模型生成返回结果。此时,Self-RAG 就会使用反思字符来自我评估输出,使其在推理过程中具有适应性。根据任务的不同,可以定制模型,通过检索更多段落来优先考虑事实准确性,或强调开放式任务的创造力。

    结语

    RAG 和 Self-RAG 的出现,进一步拓展了人工智能的边界,使得我们的机器能够更好地理解世界,更准确地回答问题。然而,这还只是开始,人工智能的未来还有无数的可能性等待我们去探索。让我们一起期待未来的到来,期待人工智能能为我们的生活带来更多的便利和惊喜。

    +参考资料:原文链接 https://mp.weixin.qq.com/s/tpAJww8gs8uurEidRWSmwA

  • 【重磅】从 RAG 到 Self-RAG:LLM 的知识增强

    大家好,欢迎来到「AI与算法学习」!今天,我们将一起探索 LLM(大型语言模型)知识增强的新篇章——从 RAG 到 Self-RAG。

    RAG:检索增强生成

    RAG(Retrieval Augmented Generation)是一种将检索与生成相结合的技术,旨在提高 LLM 的准确性和可靠性。RAG 的工作原理是:先从大量文档中检索出与给定问题相关的片段,然后将这些片段作为输入,由 LLM 生成最终的回答。

    Self-RAG:自我反思检索生成

    Self-RAG 是 RAG 的一个改进版本,它通过引入「反思字符」来实现自我评估和输出控制。反思字符是一种特殊的标记,可以帮助模型判断输出是否相关、完整,以及是否需要额外的检索。

    Self-RAG 的优势

    与传统的 RAG 方法相比,Self-RAG 具有以下优势:

    • 更主动和智能:Self-RAG 可以根据任务的不同,主动决定是否需要检索额外的信息,以及检索哪些信息。
    • 更灵活和可控:Self-RAG 可以通过调整反思字符的权重来定制模型的行为,使其更加符合特定的需求。
    • 更具解释性:Self-RAG 通过反思字符来解释模型的输出,使我们能够更好地理解模型的决策过程。

    Self-RAG 的应用

    Self-RAG 可以应用于各种各样的任务,包括:

    • 问答:Self-RAG 可以从外部文档中检索事实信息,并将其与 LLM 的输出相结合,生成更准确和完整的回答。
    • 文本摘要:Self-RAG 可以从长篇文档中提取关键信息,并将其浓缩成更短、更易读的摘要。
    • 对话系统:Self-RAG 可以利用外部知识来生成更智能、更人性化的对话。

    结语

    RAG 和 Self-RAG 是 LLM 知识增强领域的重要技术。它们通过将检索与生成相结合,显著提高了 LLM 的准确性和可靠性。随着这些技术的不断发展,我们将看到 LLM 在越来越多的领域发挥作用。

    扩展阅读

  • Elon Musk的新项目XAI “Gork”: 强大的人工智能系统

    大家好!今天我们要来了解一个引人注目的话题,那就是科技创新巨头Elon Musk的全新项目——XAI “Gork”。这是一款全新的人工智能系统,其目标竟然是与OpenAI的ChatGPT一较高下。现在就和我一起,深入了解这款即将改变AI领域格局的产品。

    首先,我们来看看Gork的基础。它基于神经网络和强化学习,这是Musk的另一家公司Neuralink在脑-机接口领域的重大突破。这种集成使Gork能够实时感知用户的思维和情绪,从而对用户有更为微妙的理解。

    Gork的特性真是令人惊叹。首先,它具有卓越的多模态能力,可以理解并生成文本、图像,甚至音频。这一特性无疑将为内容生成、虚拟现实等领域带来深远影响。其次,Gork拥有庞大的知识库,能实时从互联网更新信息,为用户提供准确且最新的回应。此外,Gork的对话技巧可以媲美,甚至超越ChatGPT,它能进行自然且连贯的对话,成为聊天机器人、客户服务和其他交互应用的理想选择。最后,Gork允许用户对其行为和回应进行微调,使开发者能够根据特定任务或行业进行定制。

    Gork的潜在影响也是不可忽视的。首先,Gork的出现可能会打破AI市场的格局,对已有模型形成挑战,推动该领域的竞争和创新。其次,Gork的多模态能力为新应用开启了大门,例如,具有人类理解上下文能力的虚拟助手,以及能同时生成文本、图像和音频的内容创作工具。然而,任何先进的AI系统都会引发伦理问题。Gork的模仿人类对话的能力和其广泛的知识库可能会被用于传播错误信息或进行有害活动。此外,依赖AI的行业,如医疗、金融和教育,可能会对Gork的定制功能感到非常满意,这可能会促使这些行业快速采用并将该模型集成到各个领域。

    让我们再深入了解一下Gork的技术特点。Gork的架构融合了深度学习和神经网络的最新进展。它采用了与ChatGPT类似的基于Transformer的模型,但加入了一些独特的元素。它使用了一种专有的Transformer架构变体,即“GorkNet”,该架构旨在增强上下文理解和多模态能力。

    Gork的训练方法也与ChatGPT有所不同。同时,Gork的大量数据源也引发了关于数据隐私和伦理问题的争论。然而,Musk公开表示,Gork的训练哲学是以“Neural Lace”为中心,这是一个他一直与之相关联的概念。这种哲学旨在确保Gork的学习过程紧密模拟人脑,使其比竞争对手更具适应性和对上下文的理解。


    Elon Musk的XAI “Gork” 是一个雄心勃勃的项目,旨在推动人工智能领域的发展,挑战已有的AI模型,并开启新的应用可能性。无论你是AI开发者,还是对AI技术感兴趣的观察者,Gork的出现都值得我们密切关注。随着Gork的进一步开发和改进,我们有理由期待它将在未来改变我们与AI的交互方式,并推动AI技术的进一步创新。

  • 【已翻车】零一万物领跑AI新纪元:Yi系列大模型首发,刷新中英文处理能力新高度

    号称全球最强的国产 AI 模型竟然套壳LLaMA!


    大家好,有一份重磅新闻要分享给大家!零一万物,这个在AI领域深耕多年的公司,刚刚发布了他们的首款开源大模型:Yi系列。这一系列的模型包括Yi-34B和Yi-6B,其中Yi-34B的表现更是令人瞩目。

    首先,让我们看看这两款模型的强大之处。你有没有想过人工智能可以一次理解两本《三体》那么长的小说,或者超过1000页的PDF文档呢?Yi-34B做到了。它有200K的上下文窗口,可以处理大约40万汉字的超长文本输入。对于需要处理长篇中文文档、书籍或报告的场景,Yi-34B无疑是一个强大的工具。

    而在中英文处理能力方面,Yi-34B更是达到了一个新的高度。在Hugging Face英文测试榜单中,Yi-34B位列第一。在中文方面,Yi-34B在C-Eval中文能力排行榜上超越了所有开源模型,包括GPT-4。无论是在CMMLU、E-Eval、Gaokao等中文评测指标上,还是在BooIQ、OBQA两个中文问答指标上,Yi-34B和Yi-6B的表现都无愧于它们的名字。

    这样的成绩,离不开零一万物的技术创新。他们自主研发的规模化训练实验平台和智能数据处理管线,以及强大的AI基础设施,都为Yi系列的训练提供了坚实的支撑。

    但零一万物并没有就此止步。他们正在积极研究专门处理数学问题的大模型MammoTH。同时,未来的Yi系列还将推出专长代码和数学的继续训练模型。

    Yi系列的发布,无疑是人工智能领域的一大里程碑。它展示了零一万物的技术实力,也为我们揭示了人工智能的无限可能性。让我们期待Yi系列在未来能带来更多的惊喜和突破!

    01-ai/Yi-34B-200K · Hugging Face

  • 让我们一起探索 WordPress 插件开发的神秘之旅 — 钩子(Hooks)

    你是一名 WordPress 开发者,或者是一个对 WordPress 插件开发充满好奇的新手吗?如果是,那么你来对了地方。让我们一起踏上探索 WordPress 插件开发的神秘之旅。今天我们将重点了解一个关键的概念 — 钩子(Hooks)。

    在插件开发的世界中,钩子就像是一条纽带,它将你的代码与 WordPress 的核心代码相连接,使之成为 WordPress 功能的一部分,而无需直接修改核心代码。这种设计使得用户可以方便地升级到 WordPress 的新版本,而无需修改任何代码。

    钩子是如何工作的?

    钩子的工作原理非常简单:当 WordPress 的工作流程到达某一点时,它会检查是否有任何函数需要”钩入”(即插入)到这一点。如果有,这些函数就会被执行。这就是所谓的“动作钩子”。

    另一种类型的钩子是“过滤器钩子”。这种钩子允许你修改 WordPress 生成的数据,然后返回修改后的数据。这使得你可以在不改变原始数据的情况下,改变数据的显示方式。

    钩子在插件开发中的重要性

    没有钩子,插件就无法改变 WordPress 的功能。钩子系统贯穿整个插件开发过程,几乎每一个插件的开发中都会用到。在你学会了钩子的用法后,你就会明白为什么 WordPress 这个平台这么强大,并有上千个插件供几百万用户使用了。

    如何在插件中使用钩子?

    在你的插件中使用钩子非常简单。首先,你需要确定你需要在何处插入代码。然后,你需要创建一个函数,这个函数将包含你需要执行的代码。最后,你需要告诉 WordPress 在何时执行你的函数,这就是你需要使用的动作钩子。

    过滤器钩子的使用方式几乎相同。你需要创建一个函数,这个函数会接收原始数据,修改它,然后返回。然后,你需要告诉 WordPress 在何时执行你的函数,这就是你需要使用的过滤器钩子。

    如何在类中使用钩子?

    在类中使用钩子与在函数中使用钩子非常相似。你只需要在添加动作或过滤器时,将函数名替换为一个数组,数组的第一个元素是类的实例(通常是 $this),第二个元素是方法名。

    在 WordPress 中,过滤器钩子(Filter Hook)是一种用于修改或过滤数据的机制。它允许开发者在特定的时间点拦截和修改数据,并返回修改后的结果。过滤器钩子广泛应用于 WordPress 的核心功能和插件开发中,提供了一种灵活的方式来自定义和扩展 WordPress 的行为。

    过滤器钩子包含两个关键元素:钩子名称和回调函数。钩子名称是用来标识特定的过滤器的字符串,而回调函数则是在钩子触发时执行的代码。回调函数接受一个或多个参数,并返回经过修改后的数据。

    下面是一个示例,演示了如何创建并使用一个过滤器钩子:

    // 创建一个过滤器钩子
    function my_custom_filter( $data ) {
        // 修改数据
        $modified_data = $data . ' (Modified)';
        
        // 返回修改后的结果
        return $modified_data;
    }
    add_filter( 'my_custom_filter_hook', 'my_custom_filter' );
    
    // 在钩子触发时调用回调函数
    $data = 'Hello';
    $filtered_data = apply_filters( 'my_custom_filter_hook', $data );
    
    // 输出修改后的结果
    echo $filtered_data; // 输出:Hello (Modified)
    

    在上面的示例中,我们首先定义了一个名为 my_custom_filter 的回调函数,它接受一个参数 $data 并返回修改后的结果。然后,我们使用 add_filter 函数将这个回调函数添加到名为 my_custom_filter_hook 的过滤器钩子上。

    最后,我们使用 apply_filters 函数来触发钩子并调用回调函数。我们将字符串 'Hello' 作为参数传递给 apply_filters 函数,然后它将调用 my_custom_filter 函数并返回修改后的结果。最后,我们将修改后的结果输出到屏幕上。

    通过使用过滤器钩子,您可以在 WordPress 中的许多地方拦截和修改数据。这使得您能够以非常灵活的方式自定义和扩展 WordPress 的功能,无需修改核心代码或插件的源代码。

    创建自定义钩子

    作为插件开发者,你不仅可以使用 WordPress 内置的钩子,还可以创建自己的钩子,供其他插件和模板使用。这使得你的插件更灵活,更易于扩展。

    在哪里可以找到钩子?

    你可以在 WordPress 的核心代码中找到所有的钩子,或者在网上查找钩子的参考列表。你也可以搜索如 “do_action”、”do_action_ref_array”、”apply_filters”、”apply_filters_ref_array” 等关键字,以找到更多的钩子。

    掌握了钩子的使用,你就拥有了改变 WordPress 功能的强大工具。所以,让我们一起开始这段神奇的插件开发之旅吧!希望你在这个过程中找到乐趣,并拥有一次丰富的学习体验。

  • 钩子(Hooks):WordPress 插件开发的神器

    各位WordPress的同仁们,你们是否曾被插件开发中的一些问题困扰,想要修改WordPress的工作流程却又不敢动核心代码?今天,我要给大家介绍一个强大的工具,那就是我们的主角——钩子(Hooks)。它就如同一把神奇的钥匙,能让我们无需直接修改核心代码,就可以改变WordPress的工作方式。这将使得我们在升级WordPress时无需担心代码的兼容问题。

    钩子:WordPress的精髓

    钩子是WordPress的精髓所在,它允许我们在插件开发中插入代码,改变WordPress的工作流程。这样,我们就可以在不直接修改核心代码的情况下,方便的升级WordPress的新版本,而不需要修改任何代码。

    如果我们直接修改了核心代码,那么在下一次WordPress升级时,所有的改动就会被覆盖掉。而使用钩子,我们可以在核心目录之外单独开发插件,这样就保证了代码在升级时的安全性。

    没有钩子,插件就无法改变WordPress的功能。钩子系统会贯穿整个插件的开发过程,而且在几乎每一个插件的开发中都会用到。掌握了钩子的用法,你就会明白为什么WordPress这个平台这么强大,并有上千个插件供几百万用户使用。

    两类钩子:动作钩子和过滤器钩子

    WordPress主要有两种类型的钩子:动作钩子和过滤器钩子。动作钩子(Action Hooks)让我们可以在特定的时刻执行一个函数,而过滤器钩子(Filter Hooks)则让我们可以操作通过钩子的输出。这两种钩子都是开发插件时的重要工具。

    动作钩子让你可以在WordPress加载过程中或者当某个事件发生的特定时刻触发一个函数。比如,你可能想要在WordPress加载一个页面或者保存一篇文章时执行一个函数。

    过滤器钩子则让你可以对通过钩子的数据进行修改。比如,你可以修改文章的内容,或者更改网站的标题等。

    钩子的使用

    要使用钩子,我们需要使用到 do_action() 和 add_action() 这两个函数。do_action() 是触发一个动作钩子,而 add_action() 是向一个动作钩子添加一个函数。

    例如,我们可以在前台的 <head> 里面添加一个名为 wp_head 的钩子,这个钩子经常被用来添加 meta 信息,样式表,和 js 脚本。

      do_action('wp_head');
    

    当这段代码在WordPress中执行时,它会寻找任何为 wp_head 动作钩子注册的动作,然后按照特定顺序执行它们。

    要向一个动作钩子添加一个函数,我们需要使用 add_action() 函数。例如,我们可以向 wp_footer 钩子添加一个函数,这个函数会在每次页面加载时执行。

    add_action( 'wp_footer', 'your_function' );
    

    其中,'wp_footer' 是你的函数执行时的动作钩子的名称,'your_function' 是你希望WordPress调用的函数名。

    结语

    钩子是WordPress插件开发中的一个强大工具,它让我们能在不改变核心代码的情况下,改变WordPress的工作流程。

  • AgentVerse:开启多智能体交互的新篇章

    欢迎来到AgentVerse!在这个充满可能性的世界中,我们致力于为大型语言模型(LLMs)提供一个自定义的多智能体环境。那么什么是AgentVerse呢?它是一个强大的框架,旨在简化为LLMs创建自定义多智能体环境的过程。这里,你可以快速、低成本地开发和定制你所需的环境,专注于你的研究,而不被实现细节所困扰。

    AgentVerse的特色

    AgentVerse的主要优势在于其高效的环境构建能力和可定制的组件。我们的框架提供了一系列基础构建模块,使得创建多智能体环境变得轻而易举。只需在配置文件中写入几行,你就可以轻松建立如LLMs的聊天室这样的基本环境。此外,AgentVerse还支持多智能体环境的工具,当前我们支持BMTools中提供的工具。

    最新消息

    我们在AgentVerse的开发过程中取得了一些重要的进展。首先,我们非常兴奋地分享我们的AI开源社区hugging face: AgentVerse。你可以在提供openai API密钥和openai组织代码后,尝试NLP Classroom和Prisoner’s Dilemma两个模拟应用程序。其次,我们还发布了一篇与本仓库相关的进行中的论文,详细介绍了AgentVerse的任务解决框架。我们还为你们提供了一个简单的H5宝可梦游戏,该游戏允许与宝可梦中的角色互动!

    开始使用

    要开始使用AgentVerse,首先你需要安装它。你可以通过

    pip install -U agentverse

    命令来安装,或者通过手动克隆最新的仓库来安装此包。然后,你需要按照我们的指示,导出你的OpenAI API密钥。如果你想使用BMTools提供的工具,你还需要安装BMTools。

    安装完成后,你就可以开始创建你的多智能体环境了。我们在agentverse/tasks目录中提供了一些示例,你可以参考这些示例来创建你自己的环境。例如,你可以创建一个教室环境,其中有一个智能体扮演教授的角色,其他的智能体扮演学生的角色。或者,你也可以创建一个更复杂的环境,例如一个数据库诊断环境,其中一个智能体扮演首席数据库管理员的角色,其他的智能体扮演内存和CPU智能体的角色。

    总的来说,无论你的需求是什么,AgentVerse都能提供一个灵活且可扩展的框架,让你能够轻松地构建和定制自己的多智能体环境。

  • 零一万物(01.AI)推出全新AI大模型:Yi系列

    欢迎诸位,我今天要分享的是一个振奋人心的新闻:零一万物(01.AI),一个全球领先的AI技术与应用公司,刚刚发布了它们新一代的AI大模型——Yi系列。Yi系列模型是一组全新的大型语言模型,它们的参数规模分别为60亿(Yi-6B)和340亿(Yi-34B)。而且,它们都支持在推理阶段将序列长度扩展至32K。

    01-ai/Yi-34B · Hugging Face

    一、Yi系列模型的诞生

    Yi系列模型是零一万物研发团队自主训练的大语言模型。首次公开发布包含两个参数尺寸为6B和34B的双语(英/中)基础模型。它们都是以4K序列长度进行训练,但在推理时可以扩展到32K。

    二、模型性能的优越表现

    Yi-6B和Yi-34B基础模型在2023年11月2日发布。在模型性能上,Yi系列模型在多项评测中展现出了全球领跑的优秀性能。

    对比同类型的开源模型,我们发现,不同模型可能采用不同的提示、后处理策略和取样技术,可能导致结果有显著的差异。我们的提示和后处理策略与原始基准测试保持一致,评估时采用贪婪解码,不对生成的内容进行任何后处理。对于原作者未报告的分数(包括以不同设定报告的分数),我们试图用我们的流程得出结果。

    我们采用了Llama2的方法论来广泛评估模型的能力。具体来说,我们引入了PIQA、SIQA、HellaSwag、WinoGrande、ARC、OBQA和CSQA来评估常识推理能力。SquAD、QuAC和BoolQ被用来评估阅读理解能力。CSQA被单独用7-shot设置进行测试,而所有其他测试都采用了0-shot配置。此外,我们在”Math & Code”分类下引入了GSM8K(8-shot@1)、MATH(4-shot@1)、HumanEval(0-shot@1)和MBPP(3-shot@1)。由于技术限制,我们没有对Falcon-180进行QuAC和OBQA的测试,分数是通过平均剩余任务的分数得出的。由于这两项任务的分数通常低于平均值,我们认为Falcon-180B的性能没有被低估。

    三、模型的使用

    我们在Github仓库上提供了关于如何使用此模型的一般指导。

    四、免责声明

    尽管我们在训练过程中使用数据合规性检查算法,以尽我们最大的能力确保训练模型的合规性,但由于数据的复杂性和语言模型使用场景的多样性,我们无法保证模型在所有场景中都能生成正确和合理的输出。请注意,模型仍有可能产生问题输出的风险。我们对任何由误用、误导、非法使用和相关的错误信息,以及任何相关的数据安全问题产生的风险和问题不承担责任。

    五、许可证

    Yi系列模型完全开放给学术研究和经过申请许可的免费商业使用。所有使用必须遵守模型许可协议2.0。要申请正式的商业许可证,请通过yi@01.ai与我们联系。

    六、结语

    Yi系列模型的诞生和发展,标志着我们正在走向人工智能的新纪元——AI 2.0。我们期待与全球的研究者、开发者和企业等合作伙伴一起,共同推动AI的进步,共同创造一个更智能、更美好的未来。

    让我们一起迎接这个全新的世界,一个由零一万物打造的,由Yi系列大模型技术推动的,AI 2.0的世界。

  • AI Comic Factory: 使用LLM + SDXL生成漫画

    大家是否曾经梦想过自己是一名漫画家?现在,借助AI Comic Factory项目,你可以轻松实现这个梦想!这个项目由GitHub用户jbilcke-hf创建,旨在使用LLM(Large Language Model)和SDXL(Stable Diffusion XL)技术生成漫画面板。这个项目由Hugging Face提供技术支持,他们一直致力于开发强大的自然语言处理工具。让我们一起深入了解AI Comic Factory的魅力吧!

    AI Comic Factory项目的目标非常明确:使用先进的人工智能技术生成漫画面板。这里使用的技术包括LLM和SDXL。LLM是指大型语言模型,它具备强大的自然语言理解和生成能力。而SDXL则是指稳定扩散XL,它是一种用于生成图像的技术。通过将这两种技术结合起来,AI Comic Factory能够自动生成精美的漫画面板,让你的创意得以实现。

    AI Comic Factory的使用非常简单。你可以通过GitHub上的链接访问项目的主页。在主页上,你可以找到详细的文档和指南,了解如何使用该项目生成漫画面板。你还可以在项目的代码库中查看源代码,了解项目的工作原理。如果你是一名开发者,你甚至可以Fork该项目并进行定制,以适应自己的需求。

    AI Comic Factory不仅适用于个人创作者,也适用于漫画工作室和出版商。通过自动化的漫画生成流程,你可以节省大量的时间和精力,并且获得高质量的漫画面板。该项目还提供了灵活的配置选项,让你能够根据自己的喜好和需求进行定制。

    AI Comic Factory是一个令人兴奋的项目,它为漫画创作提供了全新的可能性。无论你是一名漫画爱好者还是一名专业的漫画家,都可以从中受益。不妨点击上面的链接,了解更多关于AI Comic Factory的信息,并开始你的漫画创作之旅吧!让我们一起用技术的力量创造出精彩纷呈的漫画世界!

    AI Comic Factory – a Hugging Face Space by jbilcke-hf

  • 揭秘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代码能够更好地利用多核处理器的计算能力。这样不仅能提高代码的执行效率,还能在处理大数据或者复杂计算任务时,带来更好的用户体验。

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