国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

字節(jié)跳動(dòng)模型大規(guī)模部署實(shí)戰(zhàn)

人工智能 深度學(xué)習(xí)
隨著 PyTorch/TensorFlow 框架的流行,深度學(xué)習(xí)模型訓(xùn)練和在線推理完成了統(tǒng)一,開發(fā)者僅需要關(guān)注具體算法邏輯,調(diào)用框架的 Python API 完成訓(xùn)練驗(yàn)證過程即可,

一. 背景介紹

在字節(jié)跳動(dòng),基于深度學(xué)習(xí)的應(yīng)用遍地開花,工程師關(guān)注模型效果的同時(shí)也需要關(guān)注線上服務(wù)一致性和性能,早期這通常需要算法專家和工程專家分工合作并緊密配合來完成,這種模式存在比較高的 diff 排查驗(yàn)證等成本。

隨著 PyTorch/TensorFlow 框架的流行,深度學(xué)習(xí)模型訓(xùn)練和在線推理完成了統(tǒng)一,開發(fā)者僅需要關(guān)注具體算法邏輯,調(diào)用框架的 Python API 完成訓(xùn)練驗(yàn)證過程即可,之后模型可以很方便的序列化導(dǎo)出,并由統(tǒng)一的高性能 C++ 引擎完成推理工作。提升了開發(fā)者訓(xùn)練到部署的體驗(yàn)。

然而,完整的服務(wù)通常還存在大量的預(yù)處理/后處理等業(yè)務(wù)邏輯,這類邏輯通常是把各種輸入經(jīng)過加工處理轉(zhuǎn)變?yōu)?Tensor,再輸入到模型,之后模型的輸出 Tensor 再加工成目標(biāo)格式,一些典型的場(chǎng)景如下:

  • Bert
  • Resnet

圖片

圖片

我們的目標(biāo)就是為以上端到端的過程,提供自動(dòng)化且統(tǒng)一的訓(xùn)練、推理方案,減輕人工開發(fā)推理過程、對(duì)齊 diff 等一系列問題,實(shí)現(xiàn)大規(guī)模的統(tǒng)一部署方案。

二. 核心問題

PyTorch/TensorFlow 等框架相對(duì)已經(jīng)解決了模型的訓(xùn)練/推理統(tǒng)一的問題,因此模型計(jì)算本身不存在訓(xùn)推一體的問題了(算子性能優(yōu)化不在本次討論范圍)。

核心要解決的問題就是:預(yù)處理和后處理需要提供高性能訓(xùn)推一體的方案。

對(duì)于此類邏輯,TensorFlow 2.x 提供了 tf.function(還不完善),PyTorch 提供了 TorchScript,其無一例外都是選擇了原生 Python 語(yǔ)法子集。  但即使強(qiáng)大如此,仍然存在不可忽略的問題:

  • 性能:此方案大多基于虛擬機(jī)實(shí)現(xiàn),虛擬機(jī)方案靈活并且非常可控,但深度學(xué)習(xí)框架中的虛擬機(jī)大多通常性能不夠優(yōu)良。補(bǔ)充說明一下,框架早期都是為 Tensor 計(jì)算設(shè)計(jì),數(shù)組計(jì)算每個(gè)算子成本很高,虛擬機(jī)的派發(fā)和調(diào)度成本可以忽略。但是,移植到程序語(yǔ)言編程層面開銷難以忽略,代碼寫多了就會(huì)成為性能瓶頸。據(jù)測(cè)試,TorchScript 解釋器性能只有 Python 的 1/5 左右,tf.function 性能更差一些。
  • 功能不全:事實(shí)上應(yīng)用到真實(shí)場(chǎng)景中,我們?nèi)匀豢梢哉页龊芏? tf.function/TorchScript 不支持的重要功能,比如:自定義的資源不能打包,只能序列化內(nèi)置類型;字符串只能做 bytes 處理,中文等 unicode 會(huì)造成 diff;容器必須同構(gòu),不支持自定義類型等等...

再者,還有很多非深度學(xué)習(xí)任務(wù),比如在自然語(yǔ)言處理中仍然有很多非深度學(xué)習(xí)的應(yīng)用或者子任務(wù),如序列標(biāo)注,語(yǔ)言模型解碼,樹模型的人工特征構(gòu)造等任務(wù),這些通常具有更靈活的特征范式,但同時(shí)都沒有完整實(shí)現(xiàn)端到端的訓(xùn)推一體方案,仍然有大量的開發(fā)以及正確性校驗(yàn)工作。

為了解決上述問題,我們開發(fā)了一套基于編譯的預(yù)處理方案:MATXScript!

三. MATXScript

在深度學(xué)習(xí)算法開發(fā)中,開發(fā)者通常使用 Python 進(jìn)行快速迭代和實(shí)驗(yàn),同時(shí)使用 C++ 開發(fā)高性能的線上服務(wù),其中正確性校驗(yàn)和服務(wù)開發(fā)都會(huì)成為較重負(fù)擔(dān)!

MatxScript(https://github.com/bytedance/matxscript) 是一個(gè) Python 子語(yǔ)言的 AOT 編譯器,可以自動(dòng)化將 Python 翻譯成 C++,并提供一鍵打包發(fā)布功能。使用 MATXScript 可以讓開發(fā)者快速進(jìn)行模型迭代的同時(shí)以較低成本完成高性能服務(wù)的部署。

核心架構(gòu)如下:

圖片

  • 最底層是純 C++/CUDA 的基礎(chǔ)庫(kù),由高性能算子專家開發(fā)。
  • 在基礎(chǔ)庫(kù)之上,準(zhǔn)守約定封裝出來 Python 的 庫(kù),可以用在 training 過程中。
  • 需要 inferencing 時(shí),利用 MATXScript 可以把 Python 代碼,翻譯成對(duì)等的 C++ 代碼,編譯成動(dòng)態(tài)鏈接庫(kù),加上模型及其他依賴的資源,一起打包發(fā)布即可。

其中,編譯器作用非常關(guān)鍵,其核心流程如下:

圖片

通過以上流程,用戶所編寫的預(yù)處理代碼,可以被編譯成 Pipeline 中的一個(gè) JitOp,為了把前后處理和模型聯(lián)動(dòng),我們還開發(fā)了 tracing 系統(tǒng)(接口設(shè)計(jì)上參考了 PyTorch),架構(gòu)如下:

圖片

基于 MATXScript,我們可以訓(xùn)練和推理使用同一套代碼,大大降低了模型部署的成本。同時(shí),架構(gòu)和算法得到了解耦,算法同學(xué)完全使用 Python 工作即可,架構(gòu)同學(xué)專注于編譯器開發(fā)及 Runtime 優(yōu)化,在字節(jié)跳動(dòng),此方案得到了大規(guī)模部署驗(yàn)證!

四. 小試牛刀

此處以最簡(jiǎn)單的英文文本預(yù)處理為例,展示一下 MATXScript 如何使用。

目標(biāo):把一段英文文本轉(zhuǎn)成 indexes

  1. 編寫一個(gè)基本的查字典的邏輯
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)

def __call__ (self, words: List[str])
return [self.lookup(w) for w in words]
  1. 編寫 Pipeline
import matx

class WorkFlow:
def __init__(self):
# 此處會(huì)進(jìn)行代碼編譯,Python 代碼自動(dòng)編譯封裝為 Callable 對(duì)象
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]
  1. Trace 導(dǎo)出到 磁盤
# 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"}))
  1. C++ 加載
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <matxscript/pipeline/tx_session.h>
using namespace ::matxscript::runtime;
int main()
{
// test case
std::unordered_map<std::string, RTValue> feed_dict;
feed_dict.emplace("texts", Unicode(U"hello world"));
std::vector<std::pair<std::string, RTValue>> result;
const char* module_path = "./my_dir";
const char* module_name = "model.spec.json";
{
// -1 mean cpu
auto sess = TXSession::Load(module_path, module_name, -1);
auto result = sess->Run(feed_dict);
for (auto& r : result) {
std::cout << "key: " << r.first << ", value: " << r.second << std::endl;
}
}
return 0;
}

完整的代碼見:https://github.com/bytedance/matxscript/tree/main/examples/text2ids

小結(jié):以上是一個(gè)非常簡(jiǎn)單的純 Python 實(shí)現(xiàn)的預(yù)處理邏輯,且能被一段通用的 C++ 代碼加載運(yùn)行,下面我們結(jié)合模型展示一個(gè)實(shí)際的多模態(tài)端到端案例!

五. 多模態(tài)案例

此處以圖文多模態(tài)(Bert+Resnet)為例,模型使用 PyTorch 編寫,展示訓(xùn)練和部署中實(shí)際的工作。

  1. 配置環(huán)境
    a. 配置 gcc/cuda 等基礎(chǔ)設(shè)施(通常是運(yùn)維同學(xué)已經(jīng)搞定)
    b. 安裝 MATXScript 及基于此開發(fā)的基礎(chǔ)庫(kù)(text、vision等)
  2. 編寫模型代碼
    a. 此處省略,大家可以參考論文或其他開源實(shí)現(xiàn)自行搞定
  3. 編寫預(yù)處理代碼

    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] 是對(duì)齊 C++ 的 vector<string>
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()
  1. 接入 DataLoader
    a. TextPipeline 可以當(dāng)成一個(gè)正常的 Python Class 接入 Dataset 即可
    b. VisionPipeline 涉及到 GPU 預(yù)處理,更適合按 batch 進(jìn)行處理,需要自己?jiǎn)为?dú)構(gòu)造一個(gè) DataLoader(這里埋個(gè)點(diǎn),之后會(huì)開源字節(jié)跳動(dòng)內(nèi)部基于多線程的 DataLoader)
  2. 加上模型代碼,開始訓(xùn)練吧
  3. 導(dǎo)出端到端的 Inference Model
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')

小結(jié):經(jīng)過以上步驟,我們即可完成端到端的訓(xùn)練&發(fā)布工作,且整個(gè)過程是純 Python 代碼完成的,可以完全由算法同學(xué)自己控制。當(dāng)然,如果模型計(jì)算本身還有性能問題,也是可以在背后通過自動(dòng)改圖優(yōu)化工作完成。

注:完整代碼示例見 https://github.com/bytedance/matxscript/tree/main/examples/e2e_multi_modal

六. 統(tǒng)一Server

在上個(gè)章節(jié),我們得到了一個(gè)算法同學(xué)發(fā)布的模型包,本章節(jié)論述如果用統(tǒng)一的服務(wù)進(jìn)行加載和運(yùn)行。

完整的 Server 包括:IDL 協(xié)議、Batching 策略、進(jìn)/線程調(diào)度和排布、模型推理...

這里,我們只討論模型推理這塊,其他的都是可以按約定開發(fā)即可。我們以一個(gè) main 函數(shù)來示例模型加載和運(yùn)行的過程:

#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <matxscript/pipeline/tx_session.h>
using namespace ::matxscript::runtime;
int main()
{
// test case
std::unordered_map<std::string, RTValue> feed_dict;
feed_dict.emplace("texts", List({String("hello world")}));
feed_dict.emplace("images", List({String("......")}));
std::vector<std::pair<std::string, RTValue>> result;
const char* module_path = "/path/to/my_multimodal";
const char* module_name = "model.spec.json";
{
// cuda:0
auto sess = TXSession::Load(module_path, module_name, 0);
auto result = sess->Run(feed_dict);
for (auto& r : result) {
std::cout << "key: " << r.first << ", value: " << r.second << std::endl;
}
}
return 0;
}

以上代碼就是最簡(jiǎn)單的一個(gè) C++ 加載多模態(tài)模型的案例,對(duì) Server 開發(fā)的同學(xué)來說,只需進(jìn)行簡(jiǎn)單的抽象和約定,即可把上述代碼改造成一個(gè)統(tǒng)一的 C++ 模型服務(wù)框架。

七. 更多信息

我們是字節(jié)跳動(dòng)-AML-機(jī)器學(xué)習(xí)系統(tǒng)團(tuán)隊(duì),致力于為公司提供統(tǒng)一的高性能訓(xùn)推一體化框架,同時(shí)也會(huì)通過火山引擎機(jī)器學(xué)習(xí)平臺(tái)服務(wù)于合作企業(yè),火山引擎機(jī)器學(xué)習(xí)平臺(tái)預(yù)計(jì) 2023 年起提供 MATX 的相關(guān)支持,包括預(yù)置鏡像環(huán)境、常用場(chǎng)景的公開樣例、企業(yè)接入和使用過程中的技術(shù)保障等,可以達(dá)到訓(xùn)練和推理場(chǎng)景低成本加速和一體化的效果。歡迎在 https://www.volcengine.com/product/ml-platform 詳細(xì)了解我們的產(chǎn)品。

責(zé)任編輯:龐桂玉 來源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2021-09-06 11:15:05

數(shù)據(jù)治理字節(jié)跳動(dòng)埋點(diǎn)

2023-11-20 07:27:00

云原生Spark

2022-10-14 14:44:04

字節(jié)跳動(dòng)ByteTechHTTP 框架

2024-11-26 19:29:35

2022-11-24 10:01:10

架構(gòu)分布式

2025-09-10 09:59:52

2017-08-21 07:50:18

EasyStackOpenStack部署

2024-06-07 14:01:29

2023-12-01 17:42:10

2013-05-16 10:02:43

SaaS云計(jì)算部署

2013-05-22 09:40:57

大規(guī)模部署SaaSSaaS

2013-05-14 13:30:08

部署SaaS云計(jì)算

2022-06-02 16:58:06

Ray機(jī)器學(xué)習(xí)字節(jié)

2022-07-07 11:00:09

美團(tuán)模型實(shí)踐

2014-08-13 16:41:13

瞻博網(wǎng)絡(luò)OpenContraiSDN

2023-05-09 18:45:28

監(jiān)控監(jiān)視工具

2018-02-27 08:39:47

圖譜數(shù)據(jù)存儲(chǔ)

2023-12-01 17:46:31

數(shù)據(jù)庫(kù)技術(shù)

2023-06-28 08:23:41

搜索語(yǔ)義模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩精品视频免费专区在线播放| 亚洲精品在线a| 国产精品高潮在线| 2019国产精品| 牛牛在线精品视频| 蜜桃精品久久久久久久免费影院| 色综合亚洲欧洲| 欧美大片aaaa| 在线观看国产v片| 国产精品亚洲网站| 亚洲欧美日韩电影| 波多野结衣亚洲| 国产手机视频在线观看| 国精品产品一区| 精品精品国产国产自在线| 久久激情五月激情| 国产夫妻在线| 亚洲成人动漫在线| 中文字幕国产精品久久| 成人av网站在线观看免费| 成人在线观看免费播放| 国产综合免费视频| 午夜精品久久久久久99热| 成人免费在线视频观看| 国产一区二区电影在线观看| 一区二区三区性视频| 超碰97人人人人人蜜桃| 这里只有精品99re| 老司机精品视频一区二区三区| 中文字幕在线高清| 日韩精品―中文字幕| 欧美成人午夜激情在线| 偷拍25位美女撒尿视频在线观看| 日韩成人在线播放| 国产91丝袜在线播放九色| 日日夜夜亚洲| 五月综合网站| 91精品久久久久| 欧美三级乱人伦电影| 久久久青草婷婷精品综合日韩| 国产高清中文字幕在线| 日韩欧美一区三区| 日韩av片免费在线观看| 欧美日韩国产区| 久久资源在线| 欧美天堂一区二区| xxx国产在线观看| 国产日韩专区在线| 制服丝袜亚洲网站| 国产不卡视频一区| 亚洲小说图片| 天堂中文а√在线| 欧美精品久久96人妻无码| 欧美黑人xxxⅹ高潮交| 国产精品v欧美精品v日韩| 欧美体内谢she精2性欧美| 亚洲澳门在线| 国内精品久久久久久野外| 亚洲综合第一| 超碰精品一区二区三区乱码| 亚洲老司机在线| 亚洲看片一区| 国产综合色区在线观看| 奇米影视四色在线| 国产精品专区一| 欧美一级欧美三级在线观看| 国产成人在线影院| 日本亚洲不卡| 亚洲免费观看高清完整版在线观看| av日韩精品| 色哟哟在线观看| 一区二区欧美日韩| 国内精品久久久久| 天天影视网天天综合色在线播放 | 日韩av网站导航| 国产欧美精品一区| 国产精品观看| 日韩成人综合网| 人成福利视频在线观看| 亚洲成人自拍| 97色在线观看| 精品国产乱码久久久久久免费| 国产三级一区二区| 亚洲综合丁香| 亚洲都市激情| 美女av在线免费看| 超碰在线免费看| 黑人巨大国产9丨视频| 国产精品美女午夜av| 亚洲欧洲免费| 丰满少妇大力进入| 91丨九色丨国产在线| 亚洲视频第一页| 亚洲18女电影在线观看| 国产又黄又大久久| 天堂地址在线www| 丝袜美腿玉足3d专区一区| 久久久99久久精品女同性| 婷婷国产v国产偷v亚洲高清| 美女性感视频久久| av资源久久| 日本在线视频一区二区| 中文字幕免费在线视频| 极品粉嫩国产18尤物| 国产一区二区中文字幕免费看| 久久亚洲精品一区| 日韩欧美一区中文| 一区二区成人在线观看| 欧美日韩一区二区三区在线视频| 精品综合久久久久久97| 在线成人免费视频| 依依成人精品视频| 丁香亚洲综合激情啪啪综合| 欧美另类专区| 无码日韩精品一区二区免费| 亚洲精品永久免费视频| 美女欧美视频在线观看免费 | 日韩欧美视频一区二区| 成人永久免费视频| 国产三级在线播放| 亚州黄色一级| 欧美成人精品欧美一级乱| 亚洲第一在线综合在线| 91亚洲精品久久久| 亚州国产精品久久久| 亚洲天堂精品在线| 精品少妇一区二区三区在线视频| 亚洲图片欧美综合| 国产精品不卡视频| 成人免费视频caoporn| 日产欧产美韩系列久久99| 欧美jjzz| 日本黄色精品| 136导航精品福利| 国产成人免费| 欧美另类tv| 黄色免费在线网站| 国产粉嫩一区二区三区在线观看 | 国产淫片在线观看| 在线看片免费人成视久网| 97碰碰碰免费公开在线视频| 亚洲中文字幕无码不卡电影| 97久久国产亚洲精品超碰热| 亚洲日本精品一区| 少妇免费毛片久久久久久久久| 超碰97人人人人人蜜桃| 国产精品无av码在线观看| 美日韩精品免费视频| 日韩成人av一区| 精品成人私密视频| 日韩欧美另类在线| 欧美一级欧美三级在线观看| 91精品国产91热久久久做人人| 日本精品一级二级| 在线免费观看一区| 在线观看国产一区二区| 欧美日韩另类视频| 黄色精品在线看| 午夜国产不卡在线观看视频| 国产精品福利一区二区三区| 欧美国产欧美综合| 国产精品卡一卡二| 日本一区二区三区高清不卡| 中文字幕精品—区二区四季| 自拍av一区二区三区| 亚洲人成网站在线| 亚洲精品日日夜夜| 一区二区三区日韩在线观看| 一区二区三区自拍| 亚洲成av人片一区二区三区| 在线精品视频在线观看高清| 免费观看成人高潮| 秋霞影院午夜丰满少妇在线视频| 久蕉在线视频| 日本视频在线| 欧美人与性动交α欧美精品济南到 | 国产精品羞羞答答xxdd| 寂寞少妇一区二区三区| 国产成人超碰人人澡人人澡| 成人在线综合网| 久久综合狠狠综合久久激情| 欧美激情在线观看视频免费| 一区二区国产盗摄色噜噜| 色悠悠久久综合| 4438x亚洲最大成人网| 精品亚洲永久免费精品| 自拍视频国产精品| 性色av一区二区三区免费| 国产免费一区二区三区在线能观看| 96pao国产成视频永久免费| 久久久久一区二区| 成人区一区二区| 成人综合网址| 中文有码在线观看| 免费av毛片在线看| 欧美日韩在线精品一区二区三区激情综合 | 国产高清视频在线| 美女露胸视频在线观看| 本网站久久精品| 国内成人精品|