>기술 주변기기 >일체 포함 >바이트댄스 모델 대규모 전개 실전

바이트댄스 모델 대규모 전개 실전

王林
王林앞으로
2023-04-12 20:31:041158검색

바이트댄스 모델 대규모 전개 실전

1. 배경 소개

ByteDance에서는 딥 러닝 기반 애플리케이션이 곳곳에서 피어나고 있지만, 초기에는 온라인 서비스의 일관성과 성능에도 주의를 기울여야 합니다. 일반적으로 알고리즘 전문가와 엔지니어링 전문가 간의 업무 분담이 필요하며, 이 모드는 diff 문제 해결 및 검증과 같은 비용이 상대적으로 높습니다.

PyTorch/TensorFlow 프레임워크의 인기로 인해 딥 러닝 모델 훈련과 온라인 추론이 통합되었습니다. 개발자는 특정 알고리즘 로직에 주의하고 프레임워크의 Python API를 호출하기만 하면 훈련 검증 프로세스를 완료할 수 있습니다. , 모델을 쉽게 내보낼 수 있으며 추론 작업은 통합된 고성능 C++ 엔진에 의해 완료됩니다. 교육부터 배포까지 개발자 경험이 향상되었습니다.

그러나 완전한 서비스에는 일반적으로 전처리/후처리와 같은 많은 비즈니스 로직이 있습니다. 이러한 유형의 로직은 일반적으로 Tensor에 대한 다양한 입력을 처리한 다음 모델의 출력 Tensor에 입력합니다. Target 형식으로 처리되며 몇 가지 일반적인 시나리오는 다음과 같습니다.

  • Bert
  • Resnet

바이트댄스 모델 대규모 전개 실전

바이트댄스 모델 대규모 전개 실전

저희 목표는 위의 엔드투엔드 프로세스에 대해 자동화되고 통합된 교육 및 추론 솔루션을 제공하는 것입니다. , 추론 프로세스의 수동 개발, 정렬 차이 및 기타 문제를 완화하여 대규모 통합 배포 솔루션을 달성합니다.

2. 핵심 문제

PyTorch/TensorFlow 및 기타 프레임워크는 통일된 모델 훈련/추론 문제를 상대적으로 해결했기 때문에 모델 계산 자체에는 훈련과 추론을 통합하는 문제가 없습니다(운영자 성능 최적화는 범위에 속하지 않습니다). 이 토론의 내용).

해결해야 할 핵심 문제는 전처리 및 후처리를 통해 고성능 교육 및 푸시 통합 솔루션을 제공해야 한다는 것입니다.

이런 종류의 논리를 위해 TensorFlow 2.x는 tf.function(아직 완성되지 않음)을 제공하고 PyTorch는 예외 없이 기본 Python 구문의 하위 집합을 선택하는 TorchScript를 제공합니다. 하지만 그렇게 강력하더라도 여전히 무시할 수 없는 문제가 있습니다.

  • 성능: 이 솔루션은 대부분 가상 머신 구현을 기반으로 합니다. 가상 머신 솔루션은 유연하고 제어가 용이하지만 대부분의 가상 머신은 딥 러닝 프레임워크에 있습니다. 일반적으로 성능이 충분하지 않습니다. 보완적으로 프레임워크는 초기에 Tensor 컴퓨팅을 위해 설계되었습니다. 어레이 컴퓨팅의 각 운영자의 비용은 매우 높으며 가상 머신 파견 및 스케줄링 비용은 무시할 수 있습니다. 그러나 프로그래밍 언어 프로그래밍으로의 포팅에 따른 오버헤드는 무시하기 어렵고 너무 많은 코드를 작성하면 성능 병목 현상이 발생합니다. 테스트에 따르면 TorchScript 인터프리터의 성능은 Python의 약 1/5에 불과하며 tf.function의 성능은 더욱 나쁩니다.
  • 미완성 함수: 실제로 실제 시나리오에 적용하면 tf.function/TorchScript가 지원하지 않는 많은 중요한 함수를 찾을 수 있습니다. 예를 들어 사용자 정의 리소스는 패키징할 수 없으며 내장된 문자열만 직렬화할 수 있습니다. 바이트 처리를 수행할 때 중국어와 같은 유니코드는 차이를 유발합니다. 컨테이너는 동형이어야 하며 사용자 정의 유형 등을 지원하지 않습니다...

게다가 딥러닝이 아닌 작업도 여전히 많습니다. 자연어 처리에서 딥러닝이 아닌 작업 시퀀스 주석, 언어 모델 디코딩, 트리 모델의 인공적 특징 구성 등과 같은 딥러닝의 응용 프로그램 또는 하위 작업. 이들은 일반적으로 더 유연한 기능 패러다임을 가지고 있지만 동시에 아직 엔드투엔드 트레이닝 및 푸시 통합 솔루션이 완벽하게 구현되지 않았습니다. 아직 개발 및 정확성 검증 작업이 많이 남아 있습니다.

위 문제를 해결하기 위해 우리는 컴파일 기반 전처리 솔루션인 MATXScript를 개발했습니다!

3. MATXScript

딥러닝 알고리즘을 개발할 때 개발자는 빠른 반복과 실험을 위해 Python을 사용하는 반면, 고성능 온라인 서비스를 개발하려면 C++를 사용하므로 정확성 검증 및 서비스 개발 부담이 더 커집니다!

MatxScript(https://github.com/bytedance/matxscript)는 Python 하위 언어용 AOT 컴파일러로, 자동으로 Python을 C++로 변환하고 원클릭 패키징 및 게시 기능을 제공할 수 있습니다. MATXScript를 사용하면 개발자는 저렴한 비용으로 고성능 서비스를 배포하는 동시에 모델을 빠르게 반복할 수 있습니다.

핵심 아키텍처는 다음과 같습니다.

바이트댄스 모델 대규모 전개 실전

  • 가장 낮은 계층은 고성능 연산자 전문가가 개발한 순수 C++/CUDA 기본 라이브러리입니다.
  • 기본 라이브러리 위에 Python 라이브러리가 규칙에 따라 캡슐화되어 학습 과정에서 사용할 수 있습니다.
  • 추론이 필요한 경우 MATXScript를 사용하여 Python 코드를 동등한 C++ 코드로 변환하고, 이를 동적 링크 라이브러리로 컴파일하고, 모델 및 기타 종속 리소스를 추가하고, 함께 패키징하여 게시할 수 있습니다.

그 중 컴파일러의 역할은 매우 중요하며, 그 핵심 프로세스는 다음과 같습니다.

바이트댄스 모델 대규모 전개 실전

위의 프로세스를 통해 사용자가 작성한 전처리 코드를 파이프라인에서 JitOp로 컴파일할 수 있으며, 전처리 및 후처리를 모델과 연결하기 위해 우리는 다음 아키텍처를 갖춘 추적 시스템(인터페이스 디자인은 PyTorch를 참조함)도 개발했습니다.

바이트댄스 모델 대규모 전개 실전

MATXScript를 기반으로 동일한 것을 사용할 수 있습니다 훈련 및 추론을 위한 코드 세트를 제공하여 모델 배포 비용을 크게 절감합니다. 동시에 아키텍처와 알고리즘이 분리되어 알고리즘 학생들은 전적으로 Python에서 작업할 수 있습니다. 아키텍처 학생들은 컴파일러 개발 및 런타임 최적화에 집중합니다. ByteDance에서 이 솔루션은 대규모 배포로 검증되었습니다!

4. 간단한 테스트

여기에서는 MATXScript 사용 방법을 보여주기 위해 가장 간단한 영어 텍스트 전처리를 예로 들었습니다.

목표: 영어 텍스트를 인덱스로 변환

  1. 기본 사전 조회 로직 작성
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. Write Pipeline
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]
  1. 디스크로 내보내기 추적
# 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++ load
#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++로 로드할 수 있습니다. 코드 실행, 모델을 결합하여 실제 멀티모달 엔드투엔드 사례를 보여드리겠습니다!

5. 다중 모달 사례

여기서는 그래픽 및 텍스트 다중 모달(Bert+Resnet)을 예로 들어 모델이 훈련 및 배포의 실제 작업을 보여주기 위해 작성되었습니다.

  1. 환경 구성
    a. gcc/cuda 등의 인프라 구성(보통 운영 및 유지보수 학생들이 이미 수행함)
    b MATXScript 및 이를 기반으로 개발된 기본 라이브러리 설치(텍스트, 비전 등)
  2. 모델 코드 작성
    a. 논문이나 기타 오픈 소스 구현을 참조하여 직접 수행할 수 있습니다.
  3. 전처리 코드 작성

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

DataLoader에 연결합니다.
    a. TextPipeline은 일반 Python 클래스로 사용할 수 있습니다. Dataset에 연결하기만 하면 됩니다.
  1. b. VisionPipeline은 GPU 전처리를 포함하며 일괄 처리에 더 적합합니다. DataLoader를 별도로 구성해야 합니다. 나중에 ByteDance의 내부 멀티스레드 DataLoader)

    추가 모델 코드 업로드 및 훈련 시작
  2. 종단 간 추론 모델 내보내기
  3. 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()
  4. 요약: 위 단계를 완료하면 종단 간 훈련을 완료할 수 있습니다. 작업을 릴리스하고 전체 프로세스는 순수 Python 코드로 완료되며 알고리즘 학생들이 직접 제어하여 완전히 완료할 수 있습니다. 물론, 모델 계산 자체에 성능 문제가 있는 경우 자동 이미지 수정 및 최적화를 통해 백그라운드에서 완료할 수도 있습니다.

참고: 전체 코드 예제는 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++ 모델 서비스 프레임워크로 변환될 수 있습니다.

VII. 추가 정보

우리는 회사에 통합된 고성능 교육 및 프로모션 통합 프레임워크를 제공하고 Volcano Engine 머신 러닝 플랫폼을 통해 협력을 제공하는 데 전념하는 Bytedance-AML-머신 러닝 시스템 팀입니다. 기업의 경우 Volcano Engine 기계 학습 플랫폼은 2023년부터 미리 설정된 미러 환경, 일반 시나리오의 공개 샘플, 기업 액세스 및 사용 중 기술 지원 등을 포함하여 MATX 관련 지원을 제공할 것으로 예상되며 이를 통해 저비용 교육 및 추론을 달성할 수 있습니다. 시나리오 가속 및 통합 효과. https://www.volcengine.com/product/ml-platform에서 당사 제품에 대해 자세히 알아보십시오.

위 내용은 바이트댄스 모델 대규모 전개 실전의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제