ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Go语言在机器学习中有未来吗?

Go语言在机器学习中有未来吗? Go 是一种开源编程语言最初由 Google 设计用于优化系统级服务的构建和使用、在大型代码库上轻松工作以及利用多核联网机器。 Go 于 2009 年推出作为一种静态类型和编译型编程语言深受 C 语言的影响注重简单性、安全性和并发性。Go 最主要用于创建大规模应用程序例如 Docker 和 Kubernetes。 此外由于低延迟、高效的跨平台性能和易扩缩性Go 被 Netflix、PayPal 和 Uber 等公司广泛使用。 不过尽管 Go 有很多优点但它在机器学习 (ML) 中并不常用。本文将探索在 ML 中积极使用 Go 所要面对的挑战以及 Go 可以在 ML 领域立足的途径。PSGoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议通过一步撤消快速安全重构智能代码完成死代码检测和文档提示帮助所有 Go 开发人员从新手到经验丰富的专业人士创建快速、高效、和可靠的代码。将 Go 用于机器学习的主要挑战Go 是一种强大高效的编程语言速度快、性能高能够满足 AI 解决方案的 CPU 密集型、高计算量计算需求。 它比 Python 更快并具有易用、高效和并发等诸多优势在某些情况下优于 ML 中使用的其他语言。Go 有潜力创建稳健且可扩缩的 ML 应用甚至性能也比某些竞品更为优越但它在 ML 中仍然是一个被忽视的选择。 Go 在 ML 中的低采用率主要归因于它面临的一些重大挑战而 ML 领域的旧编程语言已经解决了这些挑战。 Go 面临的挑战包括缺少高级库、没有 CUDA 的原生绑定以及统计和呈现功能不够完善。缺少高级库作为一门相对较新的语言相较于已经存在了数十年且拥有完善 ML 生态系统和库的其他语言Go 的工具和库要少得多。 因此Go 可用于 ML 任务的高质量库和工具更少。这意味着想为 ML 使用 Go 的开发者必须花费更多时间构建自定义解决方案或者与并非专为 Go 设计的现有库和框架集成。多年来Go 库已经获得多项显著改进GoLearn 提供了 scikit-learn 样式的拟合与预测功能以及测试拆分和交叉验证效用函数GoMind 提供了神经网络功能类似于 TensorFlow 的计算图计算 ML 学习库 Gorgonia 提供了缩放功能。但总体而言这些库的深度仍逊于以 Python 为中心并且经过了数十年发展的库。并且在某些功能上Go 也会体现出显著差距例如自然语言处理 (NLP) 任务特别是与 spaCy 和 NLTK 相比。没有 CUDA 的原生绑定统一计算设备架构 (CUDA) 是 NVIDIA 为图形处理单元 (GPU) 编程开发的并行计算平台和编程模型它让开发者可以利用 NVIDIA GPU 的高性能计算能力加快各种应用例如ML、科学计算、图像和视频处理等。以 GPU 的大规模并行性加快可并行化的计算是 CUDA 的主要优点然而Go 不像 Python 那样具有与 CUDA 的原生绑定。要在 Go 代码中使用 CUDA首先需要导入并利用 C 函数来创建 CUDA 绑定。 公平地说C 代码通过 cgo 命令嵌入 Go从而可以创建调用 C 代码的 Go 软件包。 但是只有熟练掌握 C 语言才能依赖 C 代码和 cgo 进行高效的编码和调试这会产生巨大的开销同时也会产生特定于 C 语言的问题例如内存安全情况和安全漏洞。也有第三方代码软件包带有用于 CUDA 的 Go 绑定的效用函数例如 cuda。实验约束从本质上讲Go 并不特别适合实验。 Go 代码是一种编译型语言会转化为可由 CPU 直接执行的机器码替代在运行时由运行时环境解释。这项特性有助于提高 Go 的速度和效率但是如果不先编译就无法编写和执行 Go 代码。 因此相对于 Python 和 R 等解释型语言在 Go 中相对难以尝试不同的想法和测试不同的问题解决办法。Go 不像其他语言那样抽象自底层硬件这对于需要低级优化或严格控制硬件资源的任务来说可能是一个优势但也可能使 Go 代码更加冗长需要更多的前期设置和配置而 Python 在某些情况下相对而言更灵活、更易用。考虑到 scikit-learn 和 TensorFlow 等库和框架的深度以及在一个软件包中为特征提取、聚类和降维等任务提供更简单解决方案的可用性Go 并不是 ML 实验的最理想选择。Go这样的编译型语言通常是高性能任务的更优选例如服务器端编程和实时应用程序优化。数学和统计功能不足如前所述Go 缺乏 Python 等业界重量级选手的深度它只有少量专注于统计、微积分和矩阵操作的专属库和软件包不足以满足 ML 和人工智能开发的需求。这不一定对所有人来说都是劣势有些开发者乐于为 ML 算法或数学逻辑主动编写代码。 不过这也表示 Go 在相同数据操作、分析和预测算法上的易用性仍要低于 Python。总体而言Python、R 和 Julia 推出最早在 ML 社区中地位稳固。 Go 要想成为可行的替代方案还有很长一段路要走特别是这些现有编程语言也在持续发展使其 ML 和 AI 功能更优秀、更简单、更有效。Go 中的高级库Go 中的 Gonum、Gorgonia 和 GoLearn 等高级库为构建和训练神经网络、执行数值计算和其他 ML 任务提供了工具。然而它们的功能并不如 Python 库选项中的功能丰富TensorFlow、scikit-learn 和 spaCy 等 Python 库和框架是为满足 ML 开发者的需求而创建和迭代开发在 ML 行业中很受欢迎它们提供了适合自然语言处理、图像嵌入向量、神经网络和其他 ML 要素需要的功能。相同的功能在 Go 中也可以实现并且得益于 Go 相比其他编程语言的优势例如联网、并发和数据处理它们可能会更强大、更高效。不过创建这些功能目前只能在 Go 社区中产生用处因为 Go 在 ML 社区中并不像 Python 或 R 等语言那样流行。与更早的对应功能相比其贡献者数量也存在巨大差距导致库和工具的生态系统相对较小使得寻找某些问题的既有解决方案更加困难。情况是否正在发生变化Go 的人气越来越高社区也在不断发展。 目前据 StackShare 统计已有 2,751 家公司使用 Go其中包括 Uber、Twitch、Shopify 和 Slack。 此外根据 2021 Stack Overflow 开发者调查大约 9.55% 的开发者使用 Go是第 14 位最流行的编程语言。虽然这对 Go 社区来说是个好消息但它并没有真正转化到 ML 领域。 Go 最出名的能力在于创建可扩缩服务器和大型软件系统、编写并发程序以及启动快速轻量级微服务就连 Go 官方网站也没有将 ML 列为其典型用例。这表明 Go 目前正在远离 ML 领域也在 ML 社区中缺乏立足点。未来用例Go 在 ML 方面还没有值得注意的亮点不过考虑到语言的优势与其将 Go 视为开发 ML 模型的语言不如将其看作为 ML 模型服务的语言。Go 可用于构建 ML 模型服务器允许模型被其他应用程序或系统访问和使用。 这对于在生产中部署 ML 模型或构建可供其他开发者或用户访问的 ML API 非常有用。 它可用于构建 ML 应用例如由 ML 驱动的推荐引擎或自然语言处理工具。 它还可用于为这些类型的应用构建后端基础架构或面向用户的界面。对于 Go 社区来说创建更多工具包和框架来实现更快、更高效的服务器端 ML可能会在 ML 领域为更多实验有效开放代码库。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进