标签: AI

  • 🤖 MacOS中的Metal Bug:AI探索路上的意外旅程

    🌟 引言:当创新遇上Bug

    在现代科技的舞台上,AI机器学习(ML)已经成为炙手可热的明星,推动着各行各业的变革。作为一名经验丰富的AI研究者和写作艺术家,我时常感受到技术创新的激动人心。然而,即便我们手握最强大的工具,有时也不得不面对一些出人意料的挑战。今天的故事,就围绕着这样一个挑战展开——MacOS中的Metal Bug,以及它如何阻止了一位开发者继续进行MLX项目的工作。

    🖥️ Metal Bug:从幕后走到台前

    Metal,苹果自家的图形处理框架,通常是在后台默默工作的英雄,负责高效处理图形和计算任务。特别是在像Mac Studio M2 Ultra这样顶尖的硬件上,Metal本应带来流畅无比的体验。然而,现实往往不如想象那般完美。正如Wankyu Choi 在他的文档中提到的那样,Metal引擎的Bug却成了他工作中的“拦路虎”。

    Choi使用的两台Mac Studio M2 Ultra设备,均配备了高达192GB的内存,理论上应该是AI和MLX项目的理想工作站。然而,不知什么原因,在这些高端设备上,Metal Bug却频繁出现,导致诸如Final Cut Pro无法正常渲染,甚至在运行PyCharm等常规开发工具时也会遭遇崩溃。正如Choi所描述的,他尚未运行任何MLX代码,仅仅是在PyCharm中撰写Markdown文档,系统便开始出现问题,GPU进程卡死,最终只能通过重启或强制关闭相关进程来解决。

    “现在,仅仅运行PyCharm和一个MLX虚拟环境就会触发这个Bug。我甚至没有执行任何MLX代码。”
    — Wankyu Choi

    🧩 复杂现象背后的谜团

    Choi尝试了各种可能的解决方案,包括将两台Mac Studio M2 Ultra在不同的工作环境(音乐工作室和办公室)中交换使用。然而,即便如此,问题依然如影随形。令人费解的是,Choi似乎是唯一一个报告这个问题的人,这一点让他感到十分困惑。他推测,问题可能与他的设备配置有关,特别是在同时连接多个外部设备的情况下(例如同时使用4个Thunderbolt端口)。他指出,问题似乎只在高端配置的设备上表现得特别明显。

    “为什么我似乎是唯一一个提出这个问题的人,至今仍是一个谜。”
    — Wankyu Choi

    这让人不禁猜测,是否是某种硬件设计缺陷导致了这一问题,或者Metal本身在处理特定的极端场景时存在Bug。无论原因如何,这种情况无疑让Choi的工作变得异常艰难,甚至达到了他无法再继续参与MLX项目的地步。

    🚧 Metal Bug的影响:从开发到生产的阻碍

    对于从事AI与ML工作的研究者来说,稳定的开发环境至关重要。Choi的经历无疑为我们敲响了一记警钟:即便是最先进的硬件,也可能在执行复杂任务时表现出意想不到的问题。更糟的是,这些问题不仅影响开发过程,还可能对生产环境中的应用产生深远影响。Choi明确表示,他无法再推荐在高端Mac设备上使用MLX,尤其是在生产环境中。

    “我无法再推荐在生产环境中使用MLX,尤其是如果你使用的是高端设备。”
    — Wankyu Choi

    Choi已经通过苹果的反馈应用程序报告了这个问题,但他并不指望能很快得到回应,毕竟问题的出现似乎相当小众。然而,这并不意味着问题不真实存在,反而是一个潜在的更大问题的前兆。

    🎭 结论:当梦想被现实打断

    作为一名AI研究者,Choi对MLX寄予厚望。然而,Metal Bug的出现无情地阻断了他的探索之路。尽管他对MLX团队和社区的努力表示由衷的感谢,但他最终还是不得不做出一个艰难的决定:停止所有与MLX相关的项目。他已经将之前写好的书籍和内容保留在了GitHub上,但不会再继续更新。

    “出于这些原因,我决定停止在这个仓库中进行任何与MLX相关的工作。”
    — Wankyu Choi

    这不仅是Choi个人的遗憾,更是对整个AI社区的提醒:即便是在最先进的工具和框架下,技术问题仍然可能随时出现,影响我们的工作和进展。正如Choi所说:“我无法投入到一个让我痛苦多过快乐的项目中。”

    📚 参考文献

    • Choi, Wankyu. (2023). 《MacOS中的Metal Bug及为何我无法继续MLX项目》. GitHub Repository. 链接

  • 当实习生的“恶作剧”遇上AI模型:一场技术与伦理的较量 🤖

    在这个技术飞速发展的时代,AI已经成为了我们生活中不可或缺的一部分。然而,就在这个看似和谐的局面下,一起意想不到的事件却为我们敲响了警钟。让我们一起深入探讨这起发生在字节跳动的事件,看看当一个实习生的“恶作剧”遇上了复杂的技术和伦理问题,会产生怎样的连锁反应。

    🔍 事件背景:一场不和谐的实习

    事情的起因是某高校的博士生田某在字节跳动的商业化技术团队实习。原本应该是一个锻炼与学习的良机,但由于对团队资源分配的不满,田某选择了走上一条“极端”的道路——利用技术漏洞进行破坏。可以说,这是一次典型的“愤怒青年”式的反叛,然而,结果却是对整个团队的巨大打击。

    田某利用了Huggingface(HF)平台的漏洞,将攻击代码写入字节跳动的共享模型中,导致模型训练效果如同过山车般忽高忽低,给团队的工作带来了极大的困扰。想象一下,这就像是一位厨师在做菜时,偷偷往锅里放了盐,结果大家都以为是做的菜太咸了,殊不知是他在捣鬼。

    📉 损失究竟有多大?

    据知情人士透露,田某的恶性攻击持续了两个月,造成了近30位同事的努力化为乌有。虽然传闻称此次事件的损失可能超过千万美元,但内部人士却表示,实际损失并没有那么严重。无论如何,这一事件无疑对字节跳动的声誉和团队士气造成了重创。

    可以说,田某的行为就像是在一场精心策划的演出中,突然闯入了一位不速之客,打乱了整个节奏。这个不速之客的到来,让观众们措手不及,也让演出团队饱受困扰。

    ⚖️ 处理方式:辞退与反思

    对于田某的处理方式,传闻称其“被送进去”,但实际情况是辞退、同步给行业联盟及学校。这样的处理方式虽然看似严厉,但在一定程度上也反映了企业在面对此类事件时的无奈与无助。

    这就像是一场足球比赛,裁判虽然可以对犯规球员出示红牌,但却无法阻止他在比赛中对其他球员的伤害。对于字节跳动而言,这次事件不仅是对内部管理的一次考验,更是对行业道德和技术伦理的一次深刻反思。

    🔧 技术与伦理的碰撞

    事件的背后,其实是技术与伦理之间的复杂关系。随着技术的不断进步,如何在保障技术创新的同时,防范潜在的伦理风险,成为了一个亟待解决的问题。在这一事件中,田某虽是实习生,但其对技术的掌握与应用却让人不禁思考:在AI时代,技术是否真的能够被完全掌控?

    我们可以把技术比作一把双刃剑,既能帮助我们解决问题,也能带来意想不到的后果。如何在这把剑的锋刃上行走,考验的不仅是技术能力,更是道德意识。

    📊 数据安全与管理的挑战

    此次事件还暴露了企业在数据安全与管理方面的挑战。在字节跳动,实习生的权限几乎与正式员工没有太大差别,这让田某的恶性行为得以实施。企业在培养人才的同时,如何有效管理权限,确保数据安全,是一个值得深思的问题。

    以下是关于事件影响的可视化数据:

    graph LR
        A[事件发生] --> B[田某利用技术漏洞]
        B --> C[模型训练效果不稳定]
        C --> D[团队工作受损]
        D --> E[损失估计超过千万]
        E --> F[公司辞退与后续处理]

    🚀 未来的启示:技术伦理的重塑

    通过这起事件,我们不仅看到了技术滥用的潜在风险,也反思了在科技快速发展背景下,如何重塑技术伦理。作为未来的技术工作者,学生们必须在学习技术的同时,培养良好的道德观念。

    在这里,不妨引入一个形象的比喻:就像是驾驶一辆高性能跑车,驾驶者不仅需要掌握操控技巧,更要有安全驾驶的意识。技术的学习与应用,亦应如此。

    结语:一场未完的反思之旅

    总而言之,这起事件不仅是字节跳动内部的一次危机,更是整个科技行业的一次警醒。我们在追求技术创新的同时,不应忽视道德与伦理的重要性。希望通过这次事件,能够促使更多企业在技术管理与人才培养上进行深思熟虑的调整。

    未来的科技之路,或许依然充满荆棘,但只要我们愿意反思与改进,终将迎来更光明的前景。


  • 🤖 AI风暴来袭:老板们,别再“忽悠”员工了!

    🤔 AI时代,谁来“接盘”?

    人工智能(AI)的浪潮席卷全球,它就像一匹脱缰的野马,势不可挡地冲进我们的生活,也冲击着我们的工作。对于AI带来的冲击,不少人感到迷茫,甚至恐惧。而一些企业领导者,却试图用“一切都会好”的“鸡汤”来安抚员工,这真的可行吗?

    🤫 别再“蒙”员工了!

    世界科技巨头、身价70亿美元的Jim Kavanaugh,直言不讳地指出,老板们不应该对员工隐瞒AI对工作的影响。他认为,员工们足够聪明,不会相信AI不会改变他们的工作环境,更不会相信AI不会淘汰任何工作。

    “如果你们试图欺骗员工,告诉他们一切都会好,什么都不会改变,那简直是胡说八道!” Kavanaugh在接受CNBC采访时说道。

    他强调,虽然没有人能完全预测AI对工作的影响,但领导者有责任对员工坦诚相待,并鼓励他们积极学习AI和科技知识。

    📈 AI是“毁灭者”还是“创造者”?

    AI究竟是“毁灭者”还是“创造者”?这个问题引发了广泛的讨论。

    高盛的一份研究报告指出,生成式AI可能会取代3亿个工作岗位。报告还指出,美国和欧洲大约三分之二的现有工作岗位面临着一定程度的AI自动化风险,而生成式AI可能取代四分之一的现有工作。

    然而,Kavanaugh和Salesforce的AI负责人Clara Shih都认为,AI最终会成为工作世界中的积极力量,创造新的工作岗位。

    Shih指出,互联网的出现也曾摧毁了许多工作岗位,但同时也创造了我们以前无法想象的新工作。

    💼 未来工作,需要“重新定义”

    Shih认为,AI时代,每个人都需要重新定义自己的工作。大多数工作岗位不会消失,但每个工作岗位都需要新的描述。

    例如,Salesforce推出了一个名为AgentForce的AI平台,可以帮助企业构建和定制自己的AI“代理”,这些“代理”可以帮助企业处理客户服务和员工支持等任务。

    💡 拥抱AI,迎接挑战

    AI的到来不可避免,与其逃避,不如积极拥抱。就像Kavanaugh所说,我们要成为AI和科技的学习者,而不是畏惧者。

    AI的浪潮已经来临,让我们一起迎接挑战,在AI时代创造新的辉煌!


    😄 参考资料

    1. Billionaire tech CEO: Bosses shouldn’t ‘BS’ employees about AI impact. CNBC. (2024, September 19). Retrieved from https://www.cnbc.com/2024/09/19/billionaire-tech-ceo-bosses-shouldnt-bs-employees-about-ai-impact.html
  • 💰 AI 基建:贝莱德和微软的“千亿”豪赌

    💰 AI 基建:贝莱德和微软的“千亿”豪赌

    AI 正在席卷全球,而数据中心和电力基础设施是这场革命的基石。 就像汽车需要道路一样,AI 需要庞大的算力和能源支撑。贝莱德和微软联手,豪掷千金,打造了一只名为“Global AI Infrastructure Investment Partnership”(GAIIP)的巨型基金,誓要将AI基础设施建设推向新的高度。

    💡 300 亿美元的“起步价”,1000 亿美元的“最终目标”

    这支基金的初始投资目标为 300 亿美元,未来总投资潜力将高达 1000 亿美元。这可不是小打小闹,堪称华尔街有史以来最大的投资工具之一。贝莱德的董事长兼CEO 芬克(Larry Fink)表示,建设 AI 基础设施将释放数万亿美元的长期投资机会,这将成为推动经济增长、创造就业机会和 AI 技术创新的关键。

    💻 数据中心:数字经济的“心脏”

    GAIIP 的投资将主要集中在美国,用于新建和扩建数据中心,满足日益增长的算力需求。数据中心是数字经济的“心脏”,是 AI 算法训练和运行的“大脑”。 就像人类的大脑需要氧气一样,数据中心需要大量的电力来维持运转。

    ⚡️ 电力:AI 发展的“血液”

    除了数据中心,GAIIP 还将投资于能源基础设施,为这些设施提供电力。 AI 算法的训练需要消耗大量的电力,这就像 AI 发展的“血液”,为其提供源源不断的能量。

    🤝 强强联手:贝莱德、微软、英伟达、阿布扎比政府

    贝莱德、微软、英伟达和阿布扎比政府的强强联手,为 GAIIP 提供了强大的资金和技术支持。微软将提供资金和专业知识,英伟达将提供 AI 数据中心和 AI 工厂方面的专业知识。阿布扎比政府的加入,则为基金提供了稳定的资金来源。

    💪 开放式架构:拥抱“AI 生态”

    GAIIP 将支持开放式架构和广泛的生态系统,各种合作伙伴和公司都有非排他性的全面接触渠道。这就像一个开放的平台,吸引更多企业参与到 AI 基建的建设中,共同推动 AI 技术发展。

    🚀 AI 革命:加速进行时

    贝莱德和微软的“千亿”豪赌,不仅是资本的投入,更是对 AI 未来发展的坚定信心。 随着 AI 技术的不断发展,对算力和能源的需求将越来越大,而 GAIIP 的出现,将为 AI 革命提供强大的基础设施支撑。

    参考:

    1. 贝莱德携手微软推出300亿美元AI基建基金 投资总额将达1000亿 (https://www.dapenti.com/blog/more.asp?name=caijing&id=181230)
  • 📚 山姆·阿尔特曼推荐的九本改变人生的书籍

    在这个快速发展的科技时代,书籍依旧是人类智慧的宝库。山姆·阿尔特曼(Sam Altman),作为OpenAI的首席执行官,深知阅读的力量。他不仅热爱书籍,还认为它们能够帮助我们找到人生的意义,理解社会的复杂性,以及应对未来的挑战。本文将深入探讨阿尔特曼所推荐的九本书籍,这些作品不仅富有启发性,还能引发关于人类未来的深思。

    🌱 寻找生命的意义

    首先,阿尔特曼推荐的《活出意义来》(”Man’s Search for Meaning”)是维克多·弗兰克尔(Viktor Frankl)的经典之作。这本书以弗兰克尔在纳粹集中营的亲身经历为基础,探讨了即使在绝望中,个体依然可以找到生命的意义。弗兰克尔通过深刻的心理分析,告诉我们如何在困境中寻找自我价值,进而启发我们在日常生活中面对挑战时,寻找属于自己的目标与方向。

    🧠 理解思维的本质

    接下来是《思考,快与慢》(”Thinking, Fast and Slow”),由诺贝尔经济学奖得主丹尼尔·卡尼曼(Daniel Kahneman)撰写。这本书揭示了我们大脑的两种思维模式:快速且直觉的思维,以及慢速且深思熟虑的分析。这种思维的双重性让我们在决策时常常受到偏见的影响。阿尔特曼认为,理解这些心理机制对于做出明智的选择至关重要。

    🌌 创新思维的突破

    《从零到一》(”Zero to One”)是彼得·蒂尔(Peter Thiel)与布莱克·马斯特斯(Blake Masters)共同创作的一本书,挑战了传统的创新观念。蒂尔主张,真正的创新不是在已有基础上改进,而是创造出全新的东西。他的观点将我们从传统思维中解放出来,鼓励我们在创业和创意过程中追求独特性和突破性。

    🌍 反思未来的社会

    阿尔特曼还推荐了阿道司·赫胥黎(Aldous Huxley)的《美丽新世界》(”Brave New World”)。这本书描绘了一个未来社会,在这个社会中,幸福是被人工制造的,个体的自由和独立性受到抑制。通过主人公的反叛,赫胥黎邀请我们思考科技如何影响人类的本质,以及我们在追求幸福的过程中可能付出的代价。

    🚀 理性与想象的力量

    《无尽的开始》(”The Beginning of Infinity”)是大卫·德伊奇(David Deutsch)的一部重要作品,探讨了人类理性和想象力的无限潜力。德伊奇认为,通过知识的积累和创造性思维,我们能够克服看似无法解决的难题。这本书激励我们相信,未来的可能性是无穷的,只要我们敢于想象和探索。

    📈 快速成长的秘笈

    在创业领域,阿尔特曼推荐的《闪电扩张》(”Blitzscaling”)由里德·霍夫曼(Reid Hoffman)和克里斯·耶赫(Chris Yeh)合著,深入探讨了初创企业如何在竞争激烈的环境中迅速扩张。霍夫曼通过成功公司的案例,展示了快速增长与可持续发展的平衡,提供了宝贵的战略思路。

    🤖 人工智能的未来

    《超级智能》(”Superintelligence”)是尼克·博斯特罗姆(Nick Bostrom)的一部震撼之作,探讨了人工智能对人类未来的影响。博斯特罗姆提出了当机器智能超越人类智能时可能带来的风险和机遇,提醒我们在发展技术的同时,必须保持对人类价值的关注。这本书引发了我们对科技伦理的深刻思考。

    🏆 领导力与成功的秘诀

    在职场管理方面,阿尔特曼推荐的《赢》(”Winning”)是杰克·韦尔奇(Jack Welch)与苏茜·韦尔奇(Suzy Welch)合著的一本实用指南。书中分享了韦尔奇在通用电气的成功经验,阐述了如何建立一个有竞争力的团队,创造积极的企业文化。这本书挑战了我们对领导力的传统看法,强调了创新与团队合作的重要性。

    💼 风险投资的内幕

    最后,阿尔特曼推荐的《山丘路的秘密》(”Secrets of Sand Hill Road”)由斯科特·库波尔(Scott Kupor)撰写,揭示了硅谷风险投资的运作机制。书中详细介绍了投资者在寻找创业项目时关注的关键因素,提供了对创业者来说极具价值的融资见解。这本书不仅让我们了解风险投资的世界,也为创业者提供了实际的建议,帮助他们更好地与投资者沟通。

    🌟 总结

    山姆·阿尔特曼的这份书单,不仅是个人成长的指南,更是对人类未来的深刻思考。这些书籍涵盖了心理学、创新、社会哲学、领导力等多个领域,鼓励我们在快速变化的时代中不断学习与反思。通过阅读这些作品,我们不仅能提升自身的知识和能力,更能在面对未来的挑战时,做出更加明智的选择。

    参考文献

    1. Frankl, V. E. (1946). Man’s Search for Meaning. Beacon Press.
    2. Kahneman, D. (2011). Thinking, Fast and Slow. Farrar, Straus and Giroux.
    3. Thiel, P. , & Masters, B. (2014). Zero to One: Notes on Startups, or How to Build the Future. Crown Business.
    4. Huxley, A. (1932). Brave New World. Chatto & Windus.
    5. Deutsch, D. (2011). The Beginning of Infinity: Explanations that Transform the World. Penguin Press.
  • 教程:使用潜在扩散模型解决逆问题

    在计算机视觉和医学成像等领域,逆问题广泛存在。逆问题的目标是通过给定的观测数据重建未知信号。然而,由于观测数据和原始信号之间的关系可能是非线性的,并且观测数据通常包含噪声,这使得逆问题极具挑战性。本文提出了一种名为ReSample的新算法,通过潜在扩散模型(LDMs)来解决这一问题。以下是该方法的详细解析。


    1. 扩散模型简介

    知识点:扩散模型(Diffusion Models)是一种生成模型,通过逐步向数据中添加噪声,学习如何从噪声中恢复数据。

    解析:扩散模型的核心思想是通过一个逐步添加噪声的过程,将数据分布转化为标准正态分布。然后,训练一个神经网络来逆向模拟这个过程,从噪声中恢复原始数据。这个过程可以用一个随机微分方程(SDE)来描述。

    速记句扩散模型通过逐步加噪声和逆向去噪来模拟数据生成。


    2. 潜在扩散模型(LDMs)

    知识点:LDMs 通过在低维潜在空间中进行扩散过程来提高计算效率。

    解析:与传统在像素空间中操作的扩散模型相比,LDMs 首先通过编码器将数据映射到低维潜在空间,然后在该空间中进行扩散过程。这种方法显著降低了计算成本,并且可以通过微调模型适应不同的任务。

    速记句LDMs 通过在低维空间中进行扩散来提高效率。


    3. 逆问题的挑战

    知识点:逆问题的非线性和非凸性使得利用扩散模型解决逆问题变得困难。

    解析:在逆问题中,由于编码器和解码器的非线性,直接应用在像素空间中设计的求解器会遇到困境。这导致了重建图像时出现伪影或噪声。

    速记句逆问题的非线性和非凸性是主要挑战。


    4. ReSample算法的提出

    知识点:ReSample算法通过硬数据一致性和重新采样机制来解决逆问题。

    解析:ReSample算法的核心是通过求解一个优化问题来实现硬数据一致性,即确保潜在变量与观测数据一致。之后,通过重新采样机制将测量一致的样本映射回噪声数据流形。这一过程可以显著提高重建质量。

    速记句ReSample通过硬数据一致性和重新采样来解决逆问题。


    5. 硬数据一致性

    知识点:硬数据一致性通过优化确保重建的样本与观测数据一致。

    解析:在逆向采样过程中,ReSample算法在某些时间步上引入了一个优化问题,确保测量一致性。这种严格的优化保证了重建信号与观测数据的一致性,从而减少伪影和噪声。

    速记句硬数据一致性通过优化确保样本与观测数据一致。


    6. 重新采样机制

    知识点:重新采样机制将测量一致的样本映射回噪声数据流形。

    解析:ReSample算法在保证测量一致性后,通过一种随机重新采样方法将样本映射回噪声数据流形。这一过程有效减少了重建中的噪声,并保持了数据的一致性。

    速记句重新采样将测量一致的样本映射回噪声流形。


    7. 算法的理论优势

    知识点:ReSample算法在理论上证明了其比传统方法具有更好的稳定性和一致性。

    解析:文中通过数学推导证明了ReSample算法的随机重新采样方法在减少重建结果方差方面的优势。这一理论结果解释了ReSample在处理噪声数据时的优越性。

    速记句理论证明ReSample在减少重建方差方面具有优势。


    8. 在自然图像上的实验结果

    知识点:ReSample在自然图像的超分辨率、去模糊和修复任务中表现优异。

    解析:实验结果显示,ReSample算法在多个自然图像任务上优于现有的最先进方法,特别是在超分辨率和去模糊任务中表现突出。其在不同噪声条件下的鲁棒性也得到了验证。

    速记句ReSample在自然图像上的表现优于现有方法。


    9. 在医学图像上的应用

    知识点:ReSample算法在CT重建任务中表现出色。

    解析:在医学图像的CT重建任务中,ReSample算法同样展现了其优越性。实验表明,该算法能够更好地恢复图像中的细节,且比其他方法具有更好的结构相似性指数(SSIM)和峰值信噪比(PSNR)。

    速记句ReSample在医学图像重建中恢复细节更好。


    10. 与其他方法的对比

    知识点:与现有方法相比,ReSample在多个任务中实现了性能提升,同时减少了内存使用。

    解析:ReSample不仅在重建质量上优于其他方法,还在内存使用和计算效率方面显示出显著优势。这使得它在处理大规模数据时具有很高的实用性。

    速记句ReSample性能优越且内存使用更少。


    总结

    本文介绍了ReSample算法在逆问题中的应用,特别是在自然图像和医学图像的重建任务中的优越表现。该算法通过硬数据一致性和重新采样机制,有效解决了逆问题中的非线性和非凸性挑战。在多个任务中的实验结果验证了其优越性,尤其是在减少重建噪声和提高细节还原方面。未来的研究可以进一步优化该算法在不同应用场景中的表现。

    参考文献

    1. Song et al., “Denoising Diffusion Probabilistic Models,” 2020.
    2. Rombach et al., “High-Resolution Image Synthesis with Latent Diffusion Models,” 2022.
    3. Chung et al., “Diffusion Posterior Sampling for Inverse Problems,” 2023.
    4. Kawar et al., “Denoising Diffusion Restoration Models,” 2022.
    5. Meng & Kabashima, “Diffusion Model Posterior Sampling,” 2022.
  • 多头自注意力机制详解:手把手计算现代AI的基石

    1. 引言

    在现代人工智能领域,多头自注意力机制(Multi-Headed Self Attention, MHSA)可以说是最重要的架构范式之一。它是Transformer模型的核心组件,而Transformer又是当前最先进的大型语言模型的基础架构。本文将深入浅出地解析多头自注意力机制的工作原理,通过手动计算的方式,让读者对其内部运作有一个直观而全面的理解。

    2. 多头自注意力机制的背景

    在深入MHSA之前,我们先简要回顾一下自然语言处理(NLP)领域的相关发展历程。早期的NLP模型主要依赖于循环神经网络(RNN)和长短期记忆网络(LSTM)等序列模型。这些模型虽然能够处理序列数据,但在处理长序列时存在长期依赖问题。

    2017年,Google提出了Transformer模型,其核心就是多头自注意力机制。MHSA能够并行处理输入序列,捕捉序列中的长距离依赖关系,大大提高了模型的性能和效率。自此,MHSA成为了NLP领域的主流技术,被广泛应用于各种大型语言模型中。

    3. 多头自注意力机制的工作原理

    让我们通过一个具体的例子,step by step地计算多头自注意力机制的输出。我们将遵循以下步骤:

    1. 定义输入
    2. 定义可学习参数
    3. 计算查询(Query)、键(Key)和值(Value)
    4. 划分多个注意力头
    5. 计算Z矩阵
    6. 掩码操作
    7. 计算注意力矩阵
    8. 计算注意力头的输出
    9. 拼接多个注意力头的输出

    3.1 定义输入

    MHSA可以应用于各种类型的数据,但通常情况下,输入是一个向量序列。在自然语言处理中,这通常是词嵌入(word embedding)与位置编码(positional encoding)的组合。

    假设我们有一个简单的输入序列,包含3个词,每个词用4维向量表示:

    Input = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12]
    ]

    这个4×3的矩阵代表了我们的输入序列。

    3.2 定义可学习参数

    MHSA主要学习三个权重矩阵,用于构造”查询”(Query)、”键”(Key)和”值”(Value)。在本例中,我们假设模型已经学习到了以下权重矩阵:

    W_Q = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]
    
    W_K = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]
    
    W_V = [
        [0.1, 0.2],
        [0.3, 0.4],
        [0.5, 0.6],
        [0.7, 0.8]
    ]

    这些4×2的矩阵代表了模型的可学习参数。

    3.3 计算查询、键和值

    接下来,我们将输入与权重矩阵相乘,得到查询、键和值:

    Query = Input * W_Q
    Key = Input * W_K
    Value = Input * W_V

    让我们计算Query:

    Query = [
        [1*0.1 + 2*0.3 + 3*0.5 + 4*0.7, 1*0.2 + 2*0.4 + 3*0.6 + 4*0.8],
        [5*0.1 + 6*0.3 + 7*0.5 + 8*0.7, 5*0.2 + 6*0.4 + 7*0.6 + 8*0.8],
        [9*0.1 + 10*0.3 + 11*0.5 + 12*0.7, 9*0.2 + 10*0.4 + 11*0.6 + 12*0.8]
    ]
    
    Query = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]

    同理可得Key和Value:

    Key = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]
    
    Value = [
        [5.0, 6.0],
        [13.0, 15.0],
        [21.0, 24.0]
    ]

    3.4 划分多个注意力头

    多头自注意力机制的”多头”体现在这一步。我们将Query、Key和Value划分为多个子矩阵,每个子矩阵对应一个注意力头。在本例中,我们使用两个注意力头:

    Query_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Query_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]
    
    Key_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Key_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]
    
    Value_1 = [
        [5.0],
        [13.0],
        [21.0]
    ]
    
    Value_2 = [
        [6.0],
        [15.0],
        [24.0]
    ]

    这样,我们就得到了两组Query、Key和Value,分别用于两个注意力头的计算。

    3.5 计算Z矩阵

    接下来,我们需要计算Z矩阵,这是构造注意力矩阵的中间步骤。Z矩阵由Query和Key的矩阵乘法得到。我们以第一个注意力头为例:

    Z_1 = Query_1 * Key_1^T
    
    Z_1 = [
        [5.0],    [5.0, 13.0, 21.0]
        [13.0], *
        [21.0]
    ]
    
    Z_1 = [
        [5.0*5.0, 5.0*13.0, 5.0*21.0],
        [13.0*5.0, 13.0*13.0, 13.0*21.0],
        [21.0*5.0, 21.0*13.0, 21.0*21.0]
    ]
    
    Z_1 = [
        [25, 65, 105],
        [65, 169, 273],
        [105, 273, 441]
    ]

    为了防止Z矩阵的值随着序列长度的增加而过大,我们通常会将Z矩阵除以序列长度的平方根。在本例中,序列长度为3,所以我们将Z_1除以$\sqrt{3}$:

    Z_1 = [
        [14.43, 37.53, 60.62],
        [37.53, 97.58, 157.62],
        [60.62, 157.62, 254.62]
    ]

    同理可得Z_2。

    3.6 掩码操作

    在某些应用场景中,如语言模型预测下一个词时,我们需要进行掩码操作,以确保模型在预测时不会”看到”未来的信息。这通常通过将Z矩阵中的某些位置设置为负无穷来实现。在本例中,我们假设不需要掩码操作。

    3.7 计算注意力矩阵

    注意力矩阵是通过对Z矩阵的每一行进行softmax运算得到的。softmax函数的定义如下:

    $softmax(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$

    让我们以Z_1的第一行为例计算softmax:

    row = [14.43, 37.53, 60.62]
    e_row = [1,850,752, 20,215,372,293, 1,800,537,936,918]
    sum_e_row = 1,822,604,060,963
    
    softmax(row) = [
        1,850,752 / 1,822,604,060,963,
        20,215,372,293 / 1,822,604,060,963,
        1,800,537,936,918 / 1,822,604,060,963
    ]
    
    softmax(row) ≈ [0.001, 0.011, 0.988]

    对Z_1的每一行都进行这样的计算,我们就得到了注意力矩阵Attention_1:

    Attention_1 ≈ [
        [0.001, 0.011, 0.988],
        [0.000, 0.000, 1.000],
        [0.000, 0.000, 1.000]
    ]

    同理可得Attention_2。

    3.8 计算注意力头的输出

    得到注意力矩阵后,我们将其与Value相乘,得到每个注意力头的输出:

    Output_1 = Attention_1 * Value_1
    
    Output_1 ≈ [
        [0.001*5.0 + 0.011*13.0 + 0.988*21.0],
        [0.000*5.0 + 0.000*13.0 + 1.000*21.0],
        [0.000*5.0 + 0.000*13.0 + 1.000*21.0]
    ]
    
    Output_1 ≈ [
        [20.86],
        [21.00],
        [21.00]
    ]

    同理可得Output_2。

    3.9 拼接多个注意力头的输出

    最后,我们将所有注意力头的输出拼接起来,得到多头自注意力机制的最终输出:

    Final_Output = [Output_1 | Output_2]
    
    Final_Output ≈ [
        [20.86, 24.00],
        [21.00, 24.00],
        [21.00, 24.00]
    ]

    这个3×2的矩阵就是多头自注意力机制的输出结果。

    4. 多头自注意力机制的优势

    通过上述计算过程,我们可以看出多头自注意力机制具有以下优势:

    1. 并行计算: MHSA可以并行处理输入序列中的所有元素,大大提高了计算效率。
    2. 捕捉多种关系: 通过使用多个注意力头,模型可以同时关注输入序列中的不同特征和关系。
    3. 长距离依赖: MHSA可以有效捕捉序列中的长距离依赖关系,克服了RNN等传统模型的局限性。
    4. 灵活性: MHSA可以应用于各种类型的序列数据,不仅限于自然语言处理。
    5. 可解释性: 注意力权重可以提供模型决策过程的一定解释性,有助于理解模型的工作原理。

    5. 多头自注意力机制的应用

    MHSA在自然语言处理领域有广泛的应用,包括但不限于:

    1. 机器翻译: Transformer模型在机器翻译任务中取得了突破性的成果。
    2. 文本生成: GPT系列模型使用了基于MHSA的架构,能够生成高质量的文本。
    3. 问答系统: BERT等模型在问答任务中表现出色,为智能问答系统提供了强大的支持。
    4. 文本分类: MHSA可以有效捕捉文本的语义特征,提高分类准确率。
    5. 语音识别: 在语音识别任务中,MHSA也展现出了优秀的性能。
    6. 图像处理: 虽然最初设计用于NLP任务,但MHSA也被成功应用于计算机视觉领域。

    6. 结论

    多头自注意力机制是现代人工智能,特别是自然语言处理领域的核心技术之一。通过本文的详细计算过程,我们深入了解了MHSA的工作原理。尽管实际应用中的计算规模要大得多,但基本原理是相同的。

    理解MHSA的工作原理对于深入学习和应用先进的AI技术至关重要。随着技术的不断发展,我们可以期待MHSA在更多领域发挥重要作用,推动人工智能技术的进步。

    参考文献

    1. Warfield, D. (2024). Multi-Headed Self Attention — By Hand. Intuitively and Exhaustively Explained. https://iaee.substack.com/p/multi-headed-self-attention-by-hand
    2. Vaswani, A. , Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., … & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30.
  • 使用OpenVINO GenAI Flavor运行大语言模型

    随着人工智能技术的快速发展,大语言模型(Large Language Models, LLMs)在自然语言处理领域扮演着越来越重要的角色。然而,这些模型通常规模庞大、计算密集,给部署和推理带来了巨大挑战。为了解决这一问题,英特尔推出了OpenVINO GenAI Flavor,这是一个专门针对生成式AI模型优化的推理引擎。本文将详细介绍如何使用OpenVINO GenAI Flavor来高效运行LLMs,帮助开发者充分发挥硬件性能,实现快速、高效的模型推理。

    OpenVINO GenAI Flavor概述

    OpenVINO GenAI Flavor是OpenVINO工具套件的一个专门版本,旨在优化生成式AI模型的推理性能。它集成了多项先进技术,如动态形状支持、稀疏计算和高效内存管理等,特别适合处理LLMs这类大规模、复杂的模型。

    主要特点

    1. 专为LLMs优化:针对Transformer架构和生成式任务进行了特殊优化。
    2. 动态形状支持:能够处理变长输入序列,无需固定批处理大小。
    3. 高效内存管理:通过智能缓存和内存复用技术,显著减少内存占用。
    4. 稀疏计算加速:利用模型的稀疏性,提高计算效率。
    5. 多硬件支持:可在CPU、GPU等多种硬件平台上运行,充分利用硬件特性。

    安装和设置

    要开始使用OpenVINO GenAI Flavor,首先需要安装必要的软件包。您可以通过pip命令轻松完成安装:

    pip install openvino openvino-genai

    这将安装最新的OpenVINO开发版本以及GenAI Flavor专用组件。

    模型准备

    在使用OpenVINO GenAI Flavor之前,需要将LLM转换为OpenVINO的中间表示(IR)格式。这一步骤可以通过OpenVINO的模型转换工具完成。以下是转换过程的基本步骤:

    1. 导出原始模型:从训练框架(如PyTorch或TensorFlow)导出模型。
    2. 转换为ONNX:将模型转换为ONNX格式,这是一个通用的深度学习模型表示格式。
    3. ONNX到IR转换:使用OpenVINO的Model Optimizer工具将ONNX模型转换为IR格式。

    示例代码:

    from openvino.runtime import Core
    from transformers import AutoTokenizer, AutoModelForCausalLM
    
    # 加载预训练模型和分词器
    model_name = "gpt2"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(model_name)
    
    # 转换为ONNX格式
    onnx_model_path = "gpt2.onnx"
    dummy_input = tokenizer("Hello, how are you?", return_tensors="pt").input_ids
    torch.onnx.export(model, dummy_input, onnx_model_path, opset_version=11)
    
    # 使用OpenVINO转换为IR格式
    core = Core()
    ov_model = core.read_model(onnx_model_path)
    compiled_model = core.compile_model(ov_model, "CPU")

    使用OpenVINO GenAI Flavor进行推理

    一旦模型转换完成,就可以使用OpenVINO GenAI Flavor进行高效推理。以下是一个基本的推理流程示例:

    import numpy as np
    from openvino.runtime import Core, Tensor
    from transformers import AutoTokenizer
    
    # 初始化OpenVINO Core和模型
    core = Core()
    model = core.read_model("path/to/your/model.xml")
    compiled_model = core.compile_model(model, "CPU")
    
    # 准备输入数据
    tokenizer = AutoTokenizer.from_pretrained("gpt2")
    input_text = "OpenVINO is"
    input_ids = tokenizer.encode(input_text, return_tensors="np")
    
    # 创建推理请求
    infer_request = compiled_model.create_infer_request()
    
    # 设置输入并执行推理
    infer_request.set_input_tensor(Tensor(input_ids))
    infer_request.infer()
    
    # 获取输出
    output = infer_request.get_output_tensor().data
    
    # 解码输出
    generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
    print(generated_text)

    这个示例展示了如何使用OpenVINO GenAI Flavor加载模型、处理输入、执行推理并获取输出。

    高级功能和优化技巧

    OpenVINO GenAI Flavor提供了多种高级功能和优化技巧,可以进一步提升LLMs的推理性能:

    1. 动态形状处理

    GenAI Flavor支持动态输入形状,这对于处理变长序列非常有用:

    # 设置动态形状
    model.reshape({0: [-1, -1]})  # 第一维为批次大小,第二维为序列长度

    2. KV缓存优化

    对于自回归生成任务,GenAI Flavor实现了高效的KV缓存机制:

    # 启用KV缓存
    compiled_model = core.compile_model(model, "CPU", config={"PERFORMANCE_HINT": "LATENCY"})

    3. 稀疏计算加速

    GenAI Flavor可以自动检测和利用模型中的稀疏性,无需额外配置即可获得加速:

    # 稀疏计算会自动应用,无需特殊设置

    4. 批处理推理

    对于需要处理多个输入的场景,可以使用批处理来提高吞吐量:

    # 准备批处理输入
    batch_inputs = tokenizer(["Hello", "How are you", "OpenVINO is great"],
                             padding=True, return_tensors="np")
    
    # 执行批处理推理
    results = compiled_model(batch_inputs.input_ids)

    5. 异步推理

    利用异步推理可以更好地利用硬件资源,提高整体效率:

    # 创建异步推理请求
    infer_request = compiled_model.create_infer_request()
    
    # 启动异步推理
    infer_request.start_async()
    
    # 等待结果
    infer_request.wait()
    
    # 获取结果
    output = infer_request.get_output_tensor().data

    性能优化和调优

    为了获得最佳性能,可以考虑以下优化策略:

    1. 选择合适的硬件:根据模型大小和推理需求,选择CPU、GPU或专用AI加速器。
    2. 量化:对模型进行INT8量化可以显著减少内存占用和推理时间。
    3. 模型剪枝:移除不必要的模型参数,减小模型大小。
    4. 缓存优化:合理设置缓存大小,平衡内存使用和性能。
    5. 并行推理:在多核系统上,利用多线程并行处理多个推理请求。

    示例代码:

    # 使用INT8量化
    quantized_model = core.quantize_model(model, "CPU", {"STAT_TYPE": "DYNAMIC"})
    
    # 设置线程数
    core.set_property("CPU", {"INFERENCE_NUM_THREADS": 4})
    
    # 启用缓存
    compiled_model = core.compile_model(quantized_model, "CPU",
                                        config={"CACHE_DIR": "./model_cache"})

    最佳实践和注意事项

    1. 内存管理:对于大型LLMs,合理管理内存至关重要。使用流式处理或分段处理来减少内存占用。
    2. 输入预处理:确保输入数据格式正确,并考虑将预处理步骤集成到模型中以提高效率。
    3. 错误处理:实现健壮的错误处理机制,以应对可能的推理失败或异常情况。
    4. 模型更新:定期更新模型和OpenVINO版本,以获得最新的性能优化和功能支持。
    5. 性能监控:使用OpenVINO提供的性能分析工具来识别瓶颈并进行针对性优化。

    结论

    OpenVINO GenAI Flavor为运行大语言模型提供了强大而灵活的解决方案。通过利用其专门的优化技术和高级功能,开发者可以显著提升LLMs的推理性能,使这些复杂的模型能够在各种硬件平台上高效运行。随着生成式AI技术的不断发展,OpenVINO GenAI Flavor将继续演进,为开发者提供更多工具和能力,以应对未来的挑战和机遇。

    参考文献

    1. Intel Corporation. (2024). Run LLMs with OpenVINO GenAI Flavor — OpenVINO™ documentation. https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html
  • 将 Recommenders 示例无缝迁移到 AzureML 云平台

    引言

    随着推荐系统规模的扩大和对训练效率要求的提高,将本地实验迁移到云平台成为一种趋势。Azure 机器学习服务(AzureML)为开发者提供了一个强大的云端环境,可以用于数据准备、模型训练、测试、部署、管理和跟踪。

    本指南将以 run_notebook_on_azureml.ipynb 为例,介绍如何将 Recommenders 示例 Notebook 提交到 AzureML 计算目标,利用云平台的优势加速推荐系统开发流程。

    AzureML 简介

    AzureML 提供了丰富的功能,包括:

    • 管理云资源,用于监控、记录和组织机器学习实验。
    • 支持本地和云端训练模型,包括 GPU 加速训练。
    • 易于扩展,只需创建并指向新的计算目标即可应对数据集增长。

    准备工作

    使用 AzureML 之前,需要完成以下准备工作:

    • 拥有 Azure 订阅。如果没有,可以创建一个免费帐户,并试用 Azure 机器学习服务的免费或付费版本。
    • 安装 azure.contrib.notebook 包。
    #!pip install "azureml.contrib.notebook>=1.0.21.1"

    连接到 AzureML 工作区

    AzureML 工作区是用于组织和协调机器学习工作流的 Azure 资源,它协调存储、数据库和计算资源,为实验、部署、推理和模型监控提供额外功能。

    以下代码将获取或创建一个 AzureML 工作区,并将配置保存到 aml_config/config.json 文件中。

    ws = Workspace.create(
        name="<WORKSPACE_NAME>",
        subscription_id="<SUBSCRIPTION_ID>",
        resource_group="<RESOURCE_GROUP>",
        location="<WORKSPACE_REGION>"
        exist_ok=True,
    )

    创建或连接 Azure 机器学习计算资源

    Azure 机器学习计算是一种托管计算基础设施,允许用户轻松创建单节点到多节点的计算资源。

    以下代码将创建一个 CPU 集群作为远程计算目标。

    # 远程计算(集群)配置
    VM_SIZE = 'STANDARD_D2_V2'
    MIN_NODES = 0
    MAX_NODES = 2
    
    CLUSTER_NAME = 'cpucluster'
    
    try:
        compute_target = ComputeTarget(workspace=ws, name=CLUSTER_NAME)
        print("找到现有计算目标")
    except:
        print("正在创建新的计算目标...")
        # 指定新集群的配置
        compute_config = AmlCompute.provisioning_configuration(
            vm_size=VM_SIZE,
            min_nodes=MIN_NODES,
            max_nodes=MAX_NODES
        )
        # 使用指定的名称和配置创建集群
        compute_target = ComputeTarget.create(ws, CLUSTER_NAME, compute_config)
        # 等待集群完成,显示输出日志
        compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

    提交 Notebook

    以下代码将 sar_movielens.ipynb Notebook 提交到 AzureML 计算目标。

    NOTEBOOK_NAME = 'sar_movielens.ipynb'
    experiment_name = NOTEBOOK_NAME.strip(".ipynb")
    # ... 设置运行配置 ...
    
    cfg = NotebookRunConfig(source_directory='../',
                                notebook='notebooks/00_quick_start/' + NOTEBOOK_NAME,
                                output_notebook='outputs/out.ipynb',
                                parameters={"MOVIELENS_DATA_SIZE": "100k", "TOP_K": 10},
                                run_config=run_config)
    
    run = exp.submit(cfg)
    run

    监控运行进度

    可以使用 Jupyter 小部件监控运行进度。小部件会每隔 10-15 秒提供一次实时更新,直到作业完成。

    RunDetails(run).show()

    查看指标

    运行完成后,可以使用 run.get_metrics() 查看记录的指标。

    metrics = run.get_metrics()
    print(metrics)

    释放计算资源

    为避免不必要的费用,请确保在使用后释放创建的计算目标。

    # 删除计算目标
    compute_target.delete()

    总结

    通过将 Recommenders 示例 Notebook 提交到 AzureML 云平台,可以充分利用云计算的优势,加速推荐系统开发流程。AzureML 提供了丰富的功能和灵活的配置选项,可以满足不同规模和需求的推荐系统开发。

  • 微软 Recommenders:推荐系统实战宝典

    引言

    构建一个高效的推荐系统并非易事,需要对数据进行预处理、选择合适的算法、进行模型训练和评估,最终才能将其部署到生产环境。为了帮助开发者和研究人员更好地应对这些挑战,微软开源了 Recommenders 工具,并提供了一系列 Jupyter Notebook 示例和最佳实践,涵盖了推荐系统开发的完整流程。

    示例概览

    Recommenders 的示例 Notebook 按照功能和用途被组织在不同的目录下,具体如下表所示:

    目录是否支持本地运行描述
    00_quick_start快速入门示例,演示如何在本地环境中使用推荐算法构建推荐系统。
    01_prepare_data数据准备示例,为不同的推荐算法准备和加载数据。
    02_model_collaborative_filtering协同过滤算法模型训练和评估示例,深入探讨算法原理和实现细节。

    本地运行示例

    大部分示例 Notebook 都可以在本地 Linux 机器上直接运行,只需按照 说明 正确设置环境即可。

    注意: 某些示例可能需要异构计算实例,例如安装了 Spark 框架的 CPU 机器集群或配备 GPU 设备的机器。因此,建议在 Linux 数据科学虚拟机 (Ubuntu) 上运行这些 Notebook,因为该虚拟机预先配置了单节点 Spark 和/或 GPU 设备。

    Azure 云端增强

    为了提高大规模开发推荐系统的效率,部分示例 Notebook 还使用了 Azure 云产品和服务,例如:

    • Azure 机器学习服务: 用于训练、部署、自动化和管理机器学习模型的云服务,在示例中广泛用于超参数调整、指标跟踪和监控、计算资源扩展以及 Web 服务部署等任务。
    • Azure 数据科学虚拟机: 主要用作远程服务器,用户可以轻松配置本地和云环境以运行示例 Notebook。
    • Azure Cosmos DB: 用于存储数据,例如在模型部署示例中,将模型生成的推荐结果存储在 Cosmos DB 中以实现实时服务。
    • Azure Databricks: 主要用于在分布式计算环境中开发基于 Spark 的推荐系统,例如 Spark ALS 算法。
    • Azure Kubernetes 服务: 用于服务推荐模型或使用推荐结果为应用程序服务。

    将现有 Notebook 提交到 Azure 机器学习

    run_notebook_on_azureml 示例 Notebook 提供了一个框架,可以直接将现有 Notebook 提交到 Azure 机器学习计算目标。设置好计算目标并创建运行配置后,只需替换 Notebook 文件名即可直接提交 Notebook。

    cfg = NotebookRunConfig(source_directory='../',
                                notebook='examples/00_quick_start/' + NOTEBOOK_NAME,
                                output_notebook='outputs/out.ipynb',
                                parameters={"MOVIELENS_DATA_SIZE": "100k", "TOP_K": 10},
                                run_config=run_config)

    所有使用 store_metadata 记录的指标和参数都将作为跟踪指标存储在运行中。最初提交的 Notebook 将作为输出 Notebook out.ipynb 存储在 Azure 门户的输出选项卡中。

    总结

    微软 Recommenders 提供的示例 Notebook 为开发者和研究人员提供了一个宝贵的学习资源,可以帮助他们快速掌握构建高性能推荐系统的最佳实践。无论是本地运行还是借助 Azure 云平台,Recommenders 都能帮助您轻松构建个性化推荐体验。

人生梦想 - 关注前沿的计算机技术 acejoy.com