☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜
在字节跳动,基于深度学习的应用遍地开花,工程师关注模型效果的同时也需要关注线上服务一致性和性能,早期这通常需要算法专家和工程专家分工合作并紧密配合来完成,这种模式存在比较高的 diff 排查验证等成本。
随着 PyTorch/TensorFlow 框架的流行,深度学习模型训练和在线推理完成了统一,开发者仅需要关注具体算法逻辑,调用框架的 Python API 完成训练验证过程即可,之后模型可以很方便的序列化导出,并由统一的高性能 C++ 引擎完成推理工作。提升了开发者训练到部署的体验。
然而,完整的服务通常还存在大量的预处理/后处理等业务逻辑,这类逻辑通常是把各种输入经过加工处理转变为 Tensor,再输入到模型,之后模型的输出 Tensor 再加工成目标格式,一些典型的场景如下:
我们的目标就是为以上端到端的过程,提供自动化且统一的训练、推理方案,减轻人工开发推理过程、对齐 diff 等一系列问题,实现大规模的统一部署方案。
PyTorch/TensorFlow 等框架相对已经解决了模型的训练/推理统一的问题,因此模型计算本身不存在训推一体的问题了(算子性能优化不在本次讨论范围)。
核心要解决的问题就是:预处理和后处理需要提供高性能训推一体的方案。
对于此类逻辑,TensorFlow 2.x 提供了 tf.function(还不完善),PyTorch 提供了 TorchScript,其无一例外都是选择了原生 Python 语法子集。 但即使强大如此,仍然存在不可忽略的问题:
再者,还有很多非深度学习任务,比如在自然语言处理中仍然有很多非深度学习的应用或者子任务,如序列标注,语言模型解码,树模型的人工特征构造等任务,这些通常具有更灵活的特征范式,但同时都没有完整实现端到端的训推一体方案,仍然有大量的开发以及正确性校验工作。
为了解决上述问题,我们开发了一套基于编译的预处理方案:MATXScript!
在深度学习算法开发中,开发者通常使用 Python 进行快速迭代和实验,同时使用 C++ 开发高性能的线上服务,其中正确性校验和服务开发都会成为较重负担!
MatxScript(https://github.com/bytedance/matxscript) 是一个 Python 子语言的 AOT 编译器,可以自动化将 Python 翻译成 C++,并提供一键打包发布功能。使用 MATXScript 可以让开发者快速进行模型迭代的同时以较低成本完成高性能服务的部署。
核心架构如下:
其中,编译器作用非常关键,其核心流程如下:
通过以上流程,用户所编写的预处理代码,可以被编译成 Pipeline 中的一个 JitOp,为了把前后处理和模型联动,我们还开发了 tracing 系统(接口设计上参考了 PyTorch),架构如下:
基于 MATXScript,我们可以训练和推理使用同一套代码,大大降低了模型部署的成本。同时,架构和算法得到了解耦,算法同学完全使用 Python 工作即可,架构同学专注于编译器开发及 Runtime 优化,在字节跳动,此方案得到了大规模部署验证!
此处以最简单的英文文本预处理为例,展示一下 MATXScript 如何使用。
目标:把一段英文文本转成 indexes
class Text2Ids:
def __init__(self) -> None:
self.table: Dict[str, int] = {
"hello": 0,
"world": 1,
"[UNK]": 2,
}
def lookup(self, word: str)
return self.table.get(word, 2)
d
ef__call__ (self, words: List[str])
return [self.lookup(w) for w in words]import matx
class WorkFlow:
def __init__(self):
# 此处会进行代码编译,Python 代码自动编译封装为 Callable 对象
self.text2ids = matx.script(Text2Ids)()
def process(self, texts):
ids = self.text2ids(texts)
return ids
# test
handler = WorkFlow()
print(handler.process("hello world unknown"))
# output: [0, 1, 2]# dump
mod = matx.trace(handler.process, "hello world")
print(mod.run({"texts": "hello world"}))
mod.save('./my_dir')
# load
mod = matx.load('./my_dir', -1)
print(mod.run({"texts": "hello world"}))#include#include #include
完整的代码见:https://github.com/bytedance/matxscript/tree/main/examples/text2ids
小结:以上是一个非常简单的纯 Python 实现的预处理逻辑,且能被一段通用的 C++ 代码加载运行,下面我们结合模型展示一个实际的多模态端到端案例!
此处以图文多模态(Bert+Resnet)为例,模型使用 PyTorch 编写,展示训练和部署中实际的工作。
a. text
from typing import List, Dict, Tuple
import libcut
import matx
class Vocabulary:
...
def utf8_decoder(s: List[bytes]):
return [x.decode() for x in s]
class TextNDArrayBuilder:
...
class TextPipeline:
def __init__(self, mode: str = "eval"):
self.mode = mode
self.cut_engine = libcut.Cutter('/path/to/cut_models', ...)
self.vocab = matx.script(Vocabulary)('/path/to/vocab.txt')
self.decoder = matx.script(utf8_decoder)
self.input_builder = matx.script(TextNDArrayBuilder)(self.vocab)
def process(self, text: List[bytes]):
# List[bytes] 是对齐 C++ 的 vector
text: List[str] = self.decoder(text)
words: List[List[str]] = self.cut_engine(text)
batch_ids: List[List[int]] = self.vocab(words)
input_ids, segment_ids, mask_ids = self.input_builder(batch_ids, 32)
if self.mode == "train":
return input_ids.torch(), segment_ids.torch(), mask_ids.torch()
return input_ids, segment_ids, mask_ids b. vision
from typing import List, Dict, Tuple import matx from matx import vision class VisionPipeline: def __init__(self, device_id: int = 0, mode: str = "eval", image_size: int = 224,): self.is_training = mode == 'train' self.mode = mode ... def process(self, image,): if self.is_training: decode_nds = self.random_crop_decode(image) flip_nds = self.random_flip(decode_nds) resize_nds = self.resize(flip_nds) transpose_nd = self.transpose_norm(resize_nds, vision.SYNC) else: decode_nds = self.decode(image) resize_nds = self.resize(decode_nds) crop_nds = self.center_crop(resize_nds) transpose_nd = self.transpose_norm(crop_nds, vision.SYNC) if self.mode == "trace": return transpose_nd return transpose_nd.torch()
class MultimodalEvalPipeline:
def __init__(self):
self.text_pipe = TextPipeline(mode="eval", ...)
self.vision_pipe = VisionPipeline(mode="eval", ...)
self.torch_model = torch.jit.load('/path/to/multimodal.jit', map_locatinotallow='cuda:0')
self.tx_model_op = matx.script(self.torch_model, device=0)
def eval(self, texts: List[bytes], images: List[bytes])
input_ids, segment_ids, mask_ids = self.text_pipe.process(texts)
images = self.vision_pipe.process(images)
scores = self.tx_model_op(input_ids, segment_ids, mask_ids, images)
return scores
# examples
example_batch_size = 8
text_examples = ['hello, world'.encode()] * example_batch_size
with open('/path/image.jpg', 'rb') as f:
image_example = f.read()
image_examples = [image_example] * example_batch_size
# pipeline instance
pipe = MultimodalEvalPipeline(...)
mod = matx.trace(pipe.eval, text_examples, image_examples)
# test
print(mod.run({"texts": text_examples, "images": image_examples}))
# save
mod.save('/path/to/my_multimodal')小结:经过以上步骤,我们即可完成端到端的训练&发布工作,且整个过程是纯 Python 代码完成的,可以完全由算法同学自己控制。当然,如果模型计算本身还有性能问题,也是可以在背后通过自动改图优化工作完成。
注:完整代码示例见 https://github.com/bytedance/matxscript/tree/main/examples/e2e_multi_modal
在上个章节,我们得到了一个算法同学发布的模型包,本章节论述如果用统一的服务进行加载和运行。
完整的 Server 包括:IDL 协议、Batching 策略、进/线程调度和排布、模型推理...
这里,我们只讨论模型推理这块,其他的都是可以按约定开发即可。我们以一个 main 函数来示例模型加载和运行的过程:
#include#include #include
以上代码就是最简单的一个 C++ 加载多模态模型的案例,对 Server 开发的同学来说,只需进行简单的抽象和约定,即可把上述代码改造成一个统一的 C++ 模型服务框架。
我们是字节跳动-AML-机器学习系统团队,致力于为公司提供统一的高性能训推一体化框架,同时也会通过火山引擎机器学习平台服务于合作企业,火山引擎机器学习平台预计 2025 年起提供 MATX 的相关支持,包括预置镜像环境、常用场景的公开样例、企业接入和使用过程中的技术保障等,可以达到训练和推理场景低成本加速和一体化的效果。欢迎在 https://www.volcengine.com/product/ml-platform 详细了解我们的产品。
相关文章:
文心一言,穿越时空的恋爱奇缘,测ai17
特斯拉AI大模型,引领电动汽车智能,ai计划云顶
网站测试的重要性:确保用户体验与业务成功的关键步骤
文心一言,揭秘AI写作新用户行为洞察报告,李刚AI眼镜
怎么用AI写出高质量科普文章?揭秘新时代创作利器!
豆包AI数字人,解码数字人制作科技秘境,港大ai面试
文心一言申请攻略,揭秘通过流程及时长揭秘,ai小黑人
网站设置关键词的关键技巧与优化策略
文心一言,解锁阅读新体验的人工智能助手,AI*案例分析
AI模型推理性能深度优化策略与解析,ai学习帮
文心一言智能助手语音唤醒功能详解与操作手册,邪神祭ai
文心一言4.0重磅升级,AI写作助手引领行业新潮流,字母矛盾ai
AI赋能鸟巢模型打造,创意与技术共舞,熟练ai
打造个性化大模型,构建高效离线AI训练,AI转换AI2O3
文心一言,跨越边界,探索答案无限可能,同心圆怎么画ai
文心一言短剧,轻松一刻,一键畅享视听盛宴,ai ei ui语文书
怎么用AI写文章:高效创作的秘诀
SuperAI模型库,打造智能基石的未来蓝图,viiitor ai
撰写稿子的AI,写作的“超级助手”来了!
小艺AI大模型,革新作业体验,智能教育助手引领未来学习,漩涡背景ai
掌上AI新体验,探索端大模型的无限可能,苹果能用的免费ai写作
文心一言,高效聊天记录整理器,刘德华歌词ai
豆包陈泽,AI对话软件新锐,开启智能交互新时代,抖音的AI数据管道
3090Ti显卡在AI模型训练中的性能深度剖析,ai应用科技
AI绘画利器,高效模型资源库揭秘,轻松挑选心仪工具,yi0101ai
ChatGPT崩了?这一事件背后隐藏的深刻影响与启示
文心一言解密,接收时长之谜,开启沟通新篇章,初爱ai
南瓜瓜与AI,艺术与科技的跨界融合之旅,拥抱你ai
AI网站开发与代码创新:引领未来数字化变革的关键,ai ay规则
AI摄影培训模型构建与优化之道揭秘,ai文字边框渐变
自动挂载超链接:提升网站用户体验与SEO优化的双赢利器
AI算力模型,差异解析与融合创新之路,ai陪伴让生活充满ai
AI大模型,开启个人智能助手新时代,用ai制作狗
豆包智能AI,引领翻译,开启智能翻译新时代,ai 放射诊断
SEOLogo设计:打造品牌形象的强大武器
AI领域轻松入门指南,必读经典书籍盘点,ifix ai
小爱AI大数据模型,揭秘智能生活引擎的秘密,ai连襟
AI技术赋能,解码头部模型制作的智慧奥秘,岳不群ai
AI热门软件,未来科技的钥匙
文心一言智能体操作手册,打造您的个人高效智能助手,ai明星换脸张小斐
揭秘普林斯顿AI模型,实战高效应用手册,ai化妆品
AI自动读文:让阅读更轻松、更高效的智能革命,寄ai空
国内AI大模型公司崛起,技术驱动创新与应对,0824ai
解码AI大模型,基础设施与关键技术解析,怎么用ai设计手提袋
文心一言,引领智能时代新篇章,咪学Ai
文心一言4.0深度评测,全面解析试用攻略,ai7电影网欧美三级
如何查文章AI率?全面解析AI文章检测工具及技巧
AI的两个主要发展阶段:从起步到突破,如何重塑未来,wps ai写作去哪里
豆包AI正版下载,海量答疑引领智能学习新境界,ai写作怎么免费领稿费
AI助力手工模型汽车制作,简易教程大揭秘,ai智能业务