Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Colocando Modelos de ML em produção com Sagemaker

Matheus Queiroz
November 02, 2020
61

Colocando Modelos de ML em produção com Sagemaker

Apresentação sobre como foi colocar modelos de ML em produção com Sagemaker.

Matheus Queiroz

November 02, 2020
Tweet

Transcript

  1. Agenda • Minha Apresentação • Nosso Problema: Modelo de ML

    em produção • Introdução do Sagemaker ◦ Arquitetura ◦ Treinamento ◦ Deploy ◦ Script de Predição ◦ Prós e contras ◦ Outros tópicos 2
  2. Minha Apresentação - Podcast + Livro + Games (LoL e

    Rimworld) - Matlab -> Excel -> PL/SQL -> Delphi -> Python - Apaixonado pela área de Dados - Engenheiro de Dados especializado em ML - Python Brasil: Segunda participação, Primeira palestra 3 Matheus Queiroz
  3. Problema: Modelo de ML em produção 4 Preocupações? • Deve

    ser rápido e barato • Infraestrutura treino e predição • Sandbox e Produção • Cache, múltiplas consulta • Escalabilidade da solução O que queremos? • (Re)Treinar o modelo • Gerar uma infraestrutura • Criarmos uma forma de consulta • Validar modelos com testes AB • Monitoramento (App e modelo)
  4. Treinamento • Os dados que iremos usar devem estar em

    um S3 • Precisamos de uma imagem docker para o treinamento do nosso modelo • Podemos colocar um script e/ou requirements que irá auxiliar o realizamento do nosso treino • Ao final nosso modelo será salvo no S3 compactado no formato tar.gz 7
  5. Treinamento - Código 1. import boto3 2. from sagemaker.amazon.amazon_estimator import

    get_image_uri 3. sess = boto3.session.Session() 4. container = get_image_uri(region, "xgboost", repo_version="0.90-2") 5. linear = sagemaker.estimator.Estimator(container, 6. role, 7. train_instance_count=1, 8. train_instance_type='ml.c4.xlarge', 9. output_path=s3_output_location_for_model, 10. source_dir=s3_scripts_location_tar_gz, # requirements 11. entry_point="project-name/entry_point.py" 12. sagemaker_session=sess) 9
  6. Treinamento - Código 1. linear.set_hyperparameters( 2. max_delta_step= 4 3. max_depth=

    3 4. min_child_weight= 10 5. num_round= 130 6. scale_pos_weight= 53 7. subsample= 0.6097307675322311 8. objective: "binary:logistic" 9. ) 10. linear.fit({'train': s3_train_data}) # Resulta no model no s3 em tar.gz 10
  7. Deploy & Hospedagem • Utilizamos um modelo dentro do S3

    compactado no formato tar.gz • Definimos qual imagem iremos utilizar para hospedar nosso modelo • Podemos definir um script e/ou requirements que irá tratar nossos dados no sagemaker • Configuramos como iremos querer ter nosso endpoint no ar ◦ Seleção do modelo, podendo ser mais que um para testes AB 14
  8. Deploy - Código 1. linear_predictor = linear.deploy(initial_instance_count=1, 2. instance_type='ml.m4.xlarge') 3.

    result = linear_predictor.predict(train_set) 4. print(result) 15 - Direto após o treino feito no Sagemaker
  9. Deploy - Código 16 1. response = sm_client.create_model( 2. ModelName=model_name,

    3. PrimaryContainer={ 4. 'Image': image_uri, 5. 'ModelDataUrl': compiled_model_path, 6. 'Environment': { 7. 'SAGEMAKER_SUBMIT_DIRECTORY': predicted_script_source_path 8. } 9. }, 10. ExecutionRoleArn=role 11. ) 12.
  10. Deploy - Código 17 1. response = sm_client.create_endpoint_config( 2. EndpointConfigName=config_name

    3. ProductionVariants=[ { 4. 'VariantName': 'default-variant-name', 5. 'ModelName': model_name, 6. 'InitialInstanceCount': 1, 7. 'InstanceType': 'ml.c5.xlarge', 8. 'InitialVariantWeight': 1.0 } 9. ) 10. response = sm_client.create_endpoint( 11. EndpointName=endpoint_name, 12. EndpointConfigName=config_name )
  11. Predição - Código 20 1. def model_fn(model_dir): 2. return =

    pkl.load(open(os.path.join(model_dir, model_file), "rb")) 3. 4. def input_fn(request_body, request_content_type): 5. if request_content_type == "text/libsvm": 6. return xgb_encoders.libsvm_to_dmatrix(request_body) 7. else: 8. raise ValueError("Content type {} is not supported.".format(request_content_type)) 9. 10. def predict_fn(input_data, model): 11. prediction = model.predict(input_data) 12. feature_contribs = model.predict(input_data, pred_contribs=True) 13. return = np.hstack((prediction[:, np.newaxis], feature_contribs)) 14. 15. def output_fn(prediction, content_type): 16. if content_type == "application/json": 17. return json.dumps(prediction) 18. else: 19. raise ValueError("Content type {} is not supported.".format(content_type))
  12. Predição - Código 21 1. def transform_fn(model, request_body, content_type, accept_type):

    2. dmatrix = xgb_encoders.libsvm_to_dmatrix(request_body) 3. prediction = model.predict(dmatrix) 4. feature_contribs = model.predict(dmatrix, pred_contribs=True) 5. output = np.hstack((prediction[:, np.newaxis], feature_contribs)) 6. return json.dumps(output.tolist()) 7.
  13. Script de Predição Existem 4 funções principais que são chamadas

    nos containers disponibilizados da AWS: • model_fn: carrega seu modelo dentro da sua imagem • input_fn: recebe o request para passar os dados para predição • predict_fn: realiza a predição do seu modelo • output_fn: retorna a predição para quem realizou o request 24
  14. Prós & Contras Prós • Infraestrutura • Monitoramento • Teste

    AB • Customização 25 Contras • Documentação • Produto novo • Precisa utilizar o AWS ECR
  15. Outros tópicos Features Interessantes • Sagemaker Studio • Inference Pipeline

    • Multi Model Server 26 Open Source • Containers (link scikit-learn) • Inferência toolkit • Multi Model Server