博客导航

这篇博客整理了机器学习系统相关的博客,一方面是为了方便自己和读者查阅文章,另一方面这个手动整理的目录是一个学习路线。如果您对机器学习系统感兴趣,那么希望我的这个导航可以给到您启发。

应用

神经网络基础

神经网络之优化算法权重衰减和学习率衰减

卷积神经网络基础

自然语言处理

命名实体识别:Neural Architectures for Named Entity Recognition 论文笔记中药说明书命名实体识别方案总结

半监督学习:PET 模型和代码分析

文本攻击:NLP 文献阅读:文本对抗攻击

数据集:文本分类数据集

统计学和机器学习等

一点关于深度学习实验的思考:重复实验

牛顿法前向分步算法集成学习决策树模型

机器学习系统

深度学习框架

OneFlow:开源之夏:为 OneFlow 添加新的前端语言

MindSpore:一个算子在 MindSpore 框架中的执行流程MindSpore 开源代码评注比赛有感

DeepRec: DeepRec 做了哪些优化?

计算图及其优化

(有待补充)

Runtime 的调度和执行

(有待补充)

算子实现和优化

softmax 在计算图中的前向和后向einsum 入门指南MindSpore Reduce Sum 算子

训练

原理

(有待补充)

分布式训练

(有待补充)

参考资料

机器学习系统的实现和设计:https://openmlsys.github.io/#

推理

模型转换

(有待补充)

模型压缩

(有待补充)

服务端部署

Triton

不知不觉 “我不会用 Triton 系列” 已经攒了好多篇文章,对 Triton 的特性熟悉了不少,后来写过 backend,以及对应的 backend demo,部署了一些简单的应用,对底层源码开始熟悉起来,关于 Triton 的文章有不少:Triton Inference Server 简介上手指北如何实现一个 backendStateful Model 学习笔记Triton 搭建 ensemble 过程记录Dynamic batching 学习笔记Python Backend 的使用Model Warmup 的使用构建 Triton Server 过程记录Rate Limiter 的使用Agent 的使用命令行参数简要介绍模型的预处理操作应该部署在哪里?

kubernetes

Docker 核心原理有三,namespace 提供了逻辑上的隔离,cgroups 提供了硬件上的隔离,UnionFS 为镜像提供了基础:namespacecgroups

k8s 需要用到的 API 设计:kserve predict api v2

编译器

编译基础知识

(有待补充)

TVM

(有待补充)

参考资料

TVM:https://mlc.ai/zh/

硬件

体系结构基础知识

CSAPP 第五章: 优化程序性能

CUDA 编程

CUDA 概念汇总

CPU 编程优化

(有待补充)

语言

C++

C++:从汇编的视角看对象的创建

STL 概览STL 之 vectorSTL 之 unordered_map

C++11 Memory Order

编译链接装载:读书笔记:《程序员的自我修养》

Python

Python 学习笔记

CMake

在 CMake 项目中使用 protobuf

Shell

常用的 linux 命令

软件工程

(有待补充)

总结

机器学习系统的上层是应用,贴近用户,直接创造了业务价值。本人大五、大六的方向是自然语言处理,比较遗憾的是没有科研经历,因此在大七即将面临毕业时,希望可以在毕业论文中做一点研究,在这个过程将学习的基础知识、阅读的学术前沿记录下来。

下层是硬件,贴近开发者。机器学习系统是跟“计算”紧密相关的,需要借助体系结构的知识,达到高性能的计算。上层应用的模型发展和创新,对下层硬件的浮点计算速度、内存带宽产生了越来越高的需求。CPU 的速度已然跟不上,通过 GPU、TPU 等加速硬件可以大规模并行计算加速训练和推理。

大量加速硬件的出现对编译器产生了需求。如果有 N 个应用,M 个硬件,每个应用去对接硬件,那么这将是一个 \(N \times M\) 的问题。借助编译器,可以将这个问题转化为一个 \(N + M\) 的问题。从应用层的表示转换到硬件层的可执行对象,在这中间可以加一层中间表示,将 \(N \times M\) 变成 \(N + M\)

在上层应用和下层硬件的中间是机器学习系统。一般来说,上层应用提供的表示可以转化为计算图,中间经过“编译”生成一个运行期的计划,这个计划可以在 Runtime 中调度和执行,调度需要考虑为数据分配内存和调用算子。通过优化计算图、Runtime、算子,可以提高整体性能。

此外还要分成训练推理两个方向来讨论。以神经网络为核心的系统,训练时要同时考虑前向传播和后向传播,而推理时只需要考虑前向传播即可。

神经网络训练,需要理解 BP 算法和自动微分。大模型的出现导致了训练的时长大大增加,也可能一张卡的显存放不下一个模型,单机单卡已经没法满足需求。一般需要考虑如下几个问题:如何利用多机多卡进行分布式训练,数据传输通信的时间开销应该怎么建模,能否自动并行、自动切分模型进行训练?多机多卡训练场景,数据通信可能成为瓶颈,借助高性能网络相关技术可以加速训练。

模型训练后,需要部署上线,提供推理服务。模型训练的框架和部署推理用的框架不一样,需要将训练的模型结构转为推理用的模型结构,可以借助 ONNX 这个中间表示,来将模型进行倒腾转换。在推理框架拿到模型表示之后,推理框架自己想怎么搞就怎么搞。另一方面,推理要考虑到模型的大小,模型训练之前的设计阶段,需要考虑模型的量化怎么做,是在训练中量化还是在训练后量化呢?还可以借助知识蒸馏等技术,大模型训练小模型来进行压缩。拥有了模型推理能力,需要对外提供服务,Triton 在模型服务化方面做了不少工作,前身是 TensorRT 的服务器,可以帮助模型服务化,提供 HTTP/RPC 等服务。Triton 提供了给 kubernetes 使用的一组 API,提供稳定可靠的线上服务,自动拉起服务并监控服务。

机器学习系统,工程实践上需要主要使用 C++,Python 两种语言,项目的管理上可以选择 CMake 和 Bazel,在 Linux 上编程常常需要用到 Shell 编程方便自动化。

以上总结了我对机器学习系统的粗浅理解,也是今后要努力的方向。共勉!

posted @ 2022-10-14 22:46  楷哥  阅读(508)  评论(0编辑  收藏  举报