ByteDance에서는 딥 러닝 기반 애플리케이션이 곳곳에서 피어나고 있지만, 초기에는 온라인 서비스의 일관성과 성능에도 주의를 기울여야 합니다. 일반적으로 알고리즘 전문가와 엔지니어링 전문가 간의 업무 분담이 필요하며, 이 모드는 diff 문제 해결 및 검증과 같은 비용이 상대적으로 높습니다.
PyTorch/TensorFlow 프레임워크의 인기로 인해 딥 러닝 모델 훈련과 온라인 추론이 통합되었습니다. 개발자는 특정 알고리즘 로직에 주의하고 프레임워크의 Python API를 호출하기만 하면 훈련 검증 프로세스를 완료할 수 있습니다. , 모델을 쉽게 내보낼 수 있으며 추론 작업은 통합된 고성능 C++ 엔진에 의해 완료됩니다. 교육부터 배포까지 개발자 경험이 향상되었습니다.
그러나 완전한 서비스에는 일반적으로 전처리/후처리와 같은 많은 비즈니스 로직이 있습니다. 이러한 유형의 로직은 일반적으로 Tensor에 대한 다양한 입력을 처리한 다음 모델의 출력 Tensor에 입력합니다. Target 형식으로 처리되며 몇 가지 일반적인 시나리오는 다음과 같습니다.
저희 목표는 위의 엔드투엔드 프로세스에 대해 자동화되고 통합된 교육 및 추론 솔루션을 제공하는 것입니다. , 추론 프로세스의 수동 개발, 정렬 차이 및 기타 문제를 완화하여 대규모 통합 배포 솔루션을 달성합니다.
PyTorch/TensorFlow 및 기타 프레임워크는 통일된 모델 훈련/추론 문제를 상대적으로 해결했기 때문에 모델 계산 자체에는 훈련과 추론을 통합하는 문제가 없습니다(운영자 성능 최적화는 범위에 속하지 않습니다). 이 토론의 내용).
해결해야 할 핵심 문제는 전처리 및 후처리를 통해 고성능 교육 및 푸시 통합 솔루션을 제공해야 한다는 것입니다.
이런 종류의 논리를 위해 TensorFlow 2.x는 tf.function(아직 완성되지 않음)을 제공하고 PyTorch는 예외 없이 기본 Python 구문의 하위 집합을 선택하는 TorchScript를 제공합니다. 하지만 그렇게 강력하더라도 여전히 무시할 수 없는 문제가 있습니다.
게다가 딥러닝이 아닌 작업도 여전히 많습니다. 자연어 처리에서 딥러닝이 아닌 작업 시퀀스 주석, 언어 모델 디코딩, 트리 모델의 인공적 특징 구성 등과 같은 딥러닝의 응용 프로그램 또는 하위 작업. 이들은 일반적으로 더 유연한 기능 패러다임을 가지고 있지만 동시에 아직 엔드투엔드 트레이닝 및 푸시 통합 솔루션이 완벽하게 구현되지 않았습니다. 아직 개발 및 정확성 검증 작업이 많이 남아 있습니다.
위 문제를 해결하기 위해 우리는 컴파일 기반 전처리 솔루션인 MATXScript를 개발했습니다!
딥러닝 알고리즘을 개발할 때 개발자는 빠른 반복과 실험을 위해 Python을 사용하는 반면, 고성능 온라인 서비스를 개발하려면 C++를 사용하므로 정확성 검증 및 서비스 개발 부담이 더 커집니다!
MatxScript(https://github.com/bytedance/matxscript)는 Python 하위 언어용 AOT 컴파일러로, 자동으로 Python을 C++로 변환하고 원클릭 패키징 및 게시 기능을 제공할 수 있습니다. MATXScript를 사용하면 개발자는 저렴한 비용으로 고성능 서비스를 배포하는 동시에 모델을 빠르게 반복할 수 있습니다.
핵심 아키텍처는 다음과 같습니다.
그 중 컴파일러의 역할은 매우 중요하며, 그 핵심 프로세스는 다음과 같습니다.
위의 프로세스를 통해 사용자가 작성한 전처리 코드를 파이프라인에서 JitOp로 컴파일할 수 있으며, 전처리 및 후처리를 모델과 연결하기 위해 우리는 다음 아키텍처를 갖춘 추적 시스템(인터페이스 디자인은 PyTorch를 참조함)도 개발했습니다.
MATXScript를 기반으로 동일한 것을 사용할 수 있습니다 훈련 및 추론을 위한 코드 세트를 제공하여 모델 배포 비용을 크게 절감합니다. 동시에 아키텍처와 알고리즘이 분리되어 알고리즘 학생들은 전적으로 Python에서 작업할 수 있습니다. 아키텍처 학생들은 컴파일러 개발 및 런타임 최적화에 집중합니다. ByteDance에서 이 솔루션은 대규모 배포로 검증되었습니다!
여기에서는 MATXScript 사용 방법을 보여주기 위해 가장 간단한 영어 텍스트 전처리를 예로 들었습니다.
목표: 영어 텍스트를 인덱스로 변환
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]
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 <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
요약: 위는 순수 Python으로 구현된 매우 간단한 전처리 로직이며 일반 C++로 로드할 수 있습니다. 코드 실행, 모델을 결합하여 실제 멀티모달 엔드투엔드 사례를 보여드리겠습니다!
여기서는 그래픽 및 텍스트 다중 모달(Bert+Resnet)을 예로 들어 모델이 훈련 및 배포의 실제 작업을 보여주기 위해 작성되었습니다.
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<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
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()
참고: 전체 코드 예제는 https://github.com/bytedance/matxscript/tree/main/examples/e2e_multi_modal
6을 참조하세요. Unified Server
완전한 서버에는 다음이 포함됩니다: IDL 프로토콜, 일괄 처리 전략, 스레드/스레드 예약 및 배열, 모델 추론...
여기에서는 모델 추론만 논의하고 나머지는 합의된 대로 개발할 수 있습니다. 모델 로드 및 실행 과정을 설명하기 위해 기본 함수를 사용합니다.
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')
위 코드는 C++에서 다중 모달 모델을 로드하는 가장 간단한 사례입니다. 서버를 개발하는 학생들의 경우 간단한 추상화와 규칙만 만들면 됩니다. 위의 코드는 통합된 C++ 모델 서비스 프레임워크로 변환될 수 있습니다.
우리는 회사에 통합된 고성능 교육 및 프로모션 통합 프레임워크를 제공하고 Volcano Engine 머신 러닝 플랫폼을 통해 협력을 제공하는 데 전념하는 Bytedance-AML-머신 러닝 시스템 팀입니다. 기업의 경우 Volcano Engine 기계 학습 플랫폼은 2023년부터 미리 설정된 미러 환경, 일반 시나리오의 공개 샘플, 기업 액세스 및 사용 중 기술 지원 등을 포함하여 MATX 관련 지원을 제공할 것으로 예상되며 이를 통해 저비용 교육 및 추론을 달성할 수 있습니다. 시나리오 가속 및 통합 효과. https://www.volcengine.com/product/ml-platform에서 당사 제품에 대해 자세히 알아보십시오.
위 내용은 바이트댄스 모델 대규모 전개 실전의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!