In ByteDance florieren Anwendungen, die auf Deep Learning basieren, während sich Ingenieure zunächst auf die Konsistenz und Leistung von Online-Diensten konzentrieren Normalerweise ist eine Arbeitsteilung zwischen Algorithmenexperten und Ingenieurexperten erforderlich. Dieser Modus ist mit relativ hohen Kosten verbunden, z. B. für die Fehlerbehebung und Überprüfung.
Mit der Popularität des PyTorch/TensorFlow-Frameworks wurden Deep-Learning-Modelltraining und Online-Inferenz vereinheitlicht. Entwickler müssen nur noch auf die spezifische Algorithmuslogik achten und die Python-API des Frameworks aufrufen, um den Trainingsüberprüfungsprozess abzuschließen Das Modell kann problemlos sequenziell exportiert werden, und die Argumentationsarbeit wird durch eine einheitliche leistungsstarke C++-Engine vervollständigt. Verbesserte Entwicklererfahrung von der Schulung bis zur Bereitstellung.
Allerdings verfügt ein vollständiger Dienst normalerweise noch über eine Menge Geschäftslogik wie Vorverarbeitung/Nachverarbeitung. Diese Art von Logik verarbeitet normalerweise verschiedene Eingaben in Tensoren und gibt sie dann in den Ausgabetensor des Modells ein im Zielformat verarbeitet wird, sind einige typische Szenarien wie folgt:
Unser Ziel ist es, automatisierte und einheitliche Trainings- und Inferenzlösungen für den oben genannten End-to-End-Prozess bereitzustellen , und erleichtern Sie die manuelle Entwicklung des Inferenzprozesses, Ausrichtungsunterschiede und eine Reihe anderer Probleme, um eine umfassende, einheitliche Bereitstellungslösung zu erreichen.
PyTorch/TensorFlow und andere Frameworks haben das Problem des einheitlichen Modelltrainings/der Inferenz relativ gelöst, sodass die Modellberechnung selbst nicht das Problem der Integration von Training und Inferenz aufweist (die Optimierung der Operatorleistung liegt nicht im Rahmen). dieser Diskussion).
Das zu lösende Kernproblem besteht darin, dass Vor- und Nachverarbeitung eine leistungsstarke Trainings- und Push-Integrationslösung bereitstellen müssen.
Für diese Art von Logik stellt TensorFlow 2.x tf.function bereit (noch nicht vollständig) und PyTorch stellt TorchScript bereit, das ausnahmslos eine Teilmenge der nativen Python-Syntax auswählt. Aber auch wenn es so leistungsstark ist, gibt es immer noch Probleme, die nicht ignoriert werden können:
Darüber hinaus gibt es viele nicht tiefe Lernaufgaben, wie zum Beispiel noch viele Nicht-Deep-Learning-Aufgaben in der Verarbeitung natürlicher Sprache Anwendungen oder Teilaufgaben des Deep Learning, wie z. B. Sequenzannotation, Sprachmodelldekodierung, künstliche Merkmalskonstruktion von Baummodellen usw. Diese verfügen normalerweise über flexiblere Merkmalsparadigmen, verfügen aber gleichzeitig über flexiblere Merkmalsparadigmen Es gibt noch viel Entwicklungs- und Korrektheitsüberprüfungsarbeit.
Um die oben genannten Probleme zu lösen, haben wir eine kompilierungsbasierte Vorverarbeitungslösung entwickelt: MATXScript!
Bei der Entwicklung von Deep-Learning-Algorithmen verwenden Entwickler normalerweise Python für schnelle Iterationen und Experimente, während C++ zur Entwicklung leistungsstarker Online-Dienste verwendet wird, bei denen die Korrektheitsüberprüfung und die Dienstentwicklung zu einer größeren Belastung werden!
MatxScript (https://github.com/bytedance/matxscript) ist ein AOT-Compiler für die Python-Subsprache, der Python automatisch in C++ übersetzen und Paketierungs- und Veröffentlichungsfunktionen mit einem Klick bereitstellen kann. Durch die Verwendung von MATXScript können Entwickler Modelle schnell iterieren und gleichzeitig leistungsstarke Dienste zu geringeren Kosten bereitstellen.
Die Kernarchitektur ist wie folgt:
Unter diesen ist die Rolle des Compilers sehr wichtig, und sein Kernprozess ist wie folgt:
Durch den obigen Prozess kann der vom Benutzer geschriebene Vorverarbeitungscode in einem JitOp in der Pipeline kompiliert werden. Um die Vor- und Nachbearbeitung mit dem Modell zu verknüpfen, haben wir außerdem ein Tracing-System entwickelt (das Interface-Design bezieht sich auf PyTorch), mit folgender Architektur:
Basierend auf MATXScript können wir dasselbe verwenden Codesatz für Training und Inferenz, was die Kosten für die Modellbereitstellung erheblich senkt. Gleichzeitig sind Architektur und Algorithmus entkoppelt, und Algorithmenstudenten können sich vollständig auf die Compilerentwicklung und Laufzeitoptimierung konzentrieren. Diese Lösung wurde durch eine groß angelegte Bereitstellung überprüft.
Hier nehmen wir die einfachste englische Textvorverarbeitung als Beispiel, um zu zeigen, wie man MATXScript verwendet.
Ziel: Einen englischen Text in Indizes umwandeln
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; }
Schließen Sie das ab Code finden Sie unter: https://github.com/bytedance/matxscript/tree/main/examples/text2ids
Zusammenfassung: Das Obige ist eine sehr einfache Vorverarbeitungslogik, die in reinem Python implementiert ist und von einem allgemeinen C++ geladen werden kann Code ausführen, kombinieren wir das Modell, um einen tatsächlichen multimodalen End-to-End-Fall zu zeigen!
Hier nehmen wir Grafik- und Text-Multimodal (Bert+Resnet) als Beispiel. Das Modell wurde mit PyTorch geschrieben, um die tatsächliche Arbeit in Training und Bereitstellung zu zeigen.
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()
Der obige Code ist der einfachste Fall des Ladens eines multimodalen Modells in C++. Für Studenten, die Server entwickeln, müssen sie nur einfache Abstraktionen und Konventionen erstellen . Der obige Code kann in ein einheitliches C++-Modelldienst-Framework umgewandelt werden.
Wir sind das Bytedance-AML-Machine-Learning-System-Team, das sich dafür einsetzt, dem Unternehmen ein einheitliches, leistungsstarkes integriertes Framework für Schulung und Förderung bereitzustellen und auch die Zusammenarbeit über die Volcano Engine-Plattform für maschinelles Lernen zu unterstützen Für Unternehmen wird erwartet, dass die maschinelle Lernplattform Volcano Engine ab 2023 MATX-bezogene Unterstützung bietet, einschließlich voreingestellter Spiegelumgebungen, öffentlicher Beispiele gängiger Szenarien, technischer Unterstützung beim Unternehmenszugriff und bei der Nutzung usw., wodurch kostengünstige Schulungen und Schlussfolgerungen erzielt werden können Beschleunigungs- und Integrationseffekte. Willkommen, um mehr über unsere Produkte unter https://www.volcengine.com/product/ml-platform zu erfahren.
Das obige ist der detaillierte Inhalt vonBytedance-Modell groß angelegter Einsatz im tatsächlichen Kampf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!