Wdrażanie kodu w języku Python przy użyciu usługi Model Serving
W tym artykule opisano sposób wdrażania kodu w języku Python przy użyciu usługi Model Serving.
Funkcja pyfunc
języka Python MLflow, , zapewnia elastyczność wdrażania dowolnego fragmentu kodu w języku Python lub dowolnego modelu języka Python. Poniżej przedstawiono przykładowe scenariusze, w których warto użyć przewodnika.
- Model wymaga wstępnego przetwarzania przed przekazaniem danych wejściowych do funkcji predict modelu.
- Struktura modelu nie jest natywnie obsługiwana przez platformę MLflow.
- Aplikacja wymaga, aby nieprzetworzone dane wyjściowe modelu były przetwarzane po użyciu.
- Sam model ma logikę rozgałęziania poszczególnych żądań.
- Chcesz wdrożyć w pełni niestandardowy kod jako model.
Konstruowanie niestandardowego modelu funkcji języka Python MLflow
Platforma MLflow oferuje możliwość rejestrowania kodu w języku Python przy użyciu niestandardowego formatu modeli języka Python.
Istnieją dwie wymagane funkcje podczas pakowania dowolnego kodu python za pomocą biblioteki MLflow:
load_context
— wszystkie elementy, które należy załadować tylko raz, aby model działał, powinny być zdefiniowane w tej funkcji. Ma to kluczowe znaczenie, aby system zminimalizował liczbę artefaktów załadowanych podczaspredict
funkcji, co przyspiesza wnioskowanie.predict
— ta funkcja zawiera całą logikę, która jest uruchamiana za każdym razem, gdy jest wykonywane żądanie wejściowe.
Rejestrowanie modelu funkcji języka Python
Mimo że tworzysz model przy użyciu kodu niestandardowego, można użyć udostępnionych modułów kodu z organizacji. Za pomocą parametru code_path
autorzy modeli mogą rejestrować pełne odwołania kodu, które ładują się do ścieżki i mogą być używane z innych modeli niestandardowych pyfunc
.
Jeśli na przykład model jest rejestrowany przy użyciu:
mlflow.pyfunc.log_model(CustomModel(), "model", code_path = ["preprocessing_utils/"])
Kod z elementu preprocessing_utils
jest dostępny w załadowanym kontekście modelu. Poniżej przedstawiono przykładowy model, który używa tego kodu.
class CustomModel(mlflow.pyfunc.PythonModel):
def load_context(self, context):
self.model = torch.load(context.artifacts["model-weights"])
from preprocessing_utils.my_custom_tokenizer import CustomTokenizer
self.tokenizer = CustomTokenizer(context.artifacts["tokenizer_cache"])
def format_inputs(self, model_input):
# insert some code that formats your inputs
pass
def format_outputs(self, outputs):
predictions = (torch.sigmoid(outputs)).data.numpy()
return predictions
def predict(self, context, model_input):
model_input = self.format_inputs(model_input)
outputs = self.model.predict(model_input)
return self.format_outputs(outputs)
Obsługa modelu
Po zarejestrowaniu modelu niestandardowego pyfunc
można zarejestrować go w wykazie aparatu Unity lub rejestrze obszarów roboczych i służyć modelowi do punktu końcowego obsługującego model.
Przykład notesu
W poniższym przykładzie notesu pokazano, jak dostosować dane wyjściowe modelu, gdy nieprzetworzone dane wyjściowe zapytania modelu muszą zostać przetworzone po użyciu.