Neste módulo, você usará o algoritmo integrado de Modelagem tópica neural (NTM) do Amazon SageMaker para treinar o modelo de tópicos.

O NTM do Amazon SageMaker é um algoritmo de aprendizagem não supervisionado usado para organizar um corpus de documentos em tópicos que contêm agrupamentos de palavras com base em sua distribuição estatística. Documentos que contêm ocorrências frequentes de palavras como "bicicleta", "carro", "trem", "quilometragem" e "velocidade" provavelmente compartilham um tópico sobre "transporte", por exemplo. A modelagem de tópicos pode ser usada para classificar ou resumir documentos com base nos tópicos detectados ou para recuperar informações ou recomendar conteúdo com base em similaridades de tópicos. Os tópicos dos documentos que o NTM aprende são caracterizados como uma representação latente porque os tópicos são inferidos a partir das distribuições de palavras observadas no corpus. A semântica dos tópicos geralmente é inferida examinando as palavras mais importantes que eles contêm. Como o método não é supervisionado, apenas o número de tópicos, e não os próprios tópicos, são pré-especificados. Além disso, não é garantido que os tópicos estejam alinhados à forma como um humano categorizaria naturalmente os documentos.

Nas etapas a seguir, você especificará o algoritmo NTM para o trabalho de treinamento, especificará a infraestrutura do modelo, definirá os valores do hiperparâmetro para ajustar o modelo e executará o modelo. Em seguida, você implantará o modelo em um endpoint gerenciado pelo Amazon SageMaker para fazer previsões.

Tempo de conclusão do módulo: 20 minutos


  • Etapa 1. Crie e execute um trabalho de treinamento

    Os algoritmos integrados do Amazon SageMaker são armazenados como contêineres do docker no Amazon Elastic Container Registry (Amazon ECR). Para o treinamento do modelo, primeiro é necessário especificar o local do contêiner NTM no Amazon ECR mais próximo da sua região.

    Na sua instância de bloco de anotações, copie e cole o código a seguir em uma nova célula de código e escolha Executar.

    import boto3
    from sagemaker.amazon.amazon_estimator import get_image_uri
    container = get_image_uri(boto3.Session().region_name, 'ntm')

    O Amazon SageMaker Python SDK inclui o estimador sagemaker.estimator.Estimator. Esse estimador permite especificar a infraestrutura (tipo de instância do Amazon EC2, número de instâncias, hiperparâmetros, caminho de saída e, opcionalmente, quaisquer configurações relacionadas à segurança (Virtual Private Cloud (VPC), grupos de segurança etc.) que possam ser relevantes se estivermos treinando o modelo em uma VPC personalizada de nossa escolha, em oposição a uma Amazon VPC. O NTM tira proveito total do hardware da GPU e, em geral, treina aproximadamente uma ordem de magnitude mais rapidamente em uma GPU do que em uma CPU. O treinamento com várias GPUs ou com várias instâncias melhora ainda mais a velocidade de treinamento de forma linear se a sobrecarga da comunicação for baixa em comparação com o tempo de computação.

    Para criar uma instância da classe sagemaker.estimator.Estimator, copie e cole o código a seguir em uma nova célula de código e escolha Executar.

    sess = sagemaker.Session()
    ntm = sagemaker.estimator.Estimator(container,
                                        role, 
                                        train_instance_count=2, 
                                        train_instance_type='ml.c4.xlarge',
                                        output_path=output_path,
                                        sagemaker_session=sess)
    

    Agora, você pode definir os hiperparâmetros para o modelo de tópicos:

    ntm.set_hyperparameters(num_topics=NUM_TOPICS, feature_dim=vocab_size, mini_batch_size=128, 
                            epochs=100, num_patience_epochs=5, tolerance=0.001)
    

    O SageMaker oferece dois modos para canais de dados:

    • FullyReplicated: todos os arquivos de dados são copiados para todos os operadores.
    • ShardedByS3Key: os arquivos de dados são divididos entre diferentes operadores, ou seja, cada operador recebe uma parte diferente do conjunto de dados completo.

    No momento da gravação, por padrão, o Amazon SageMaker Python SDK usa o modo FullyReplicated para todos os canais de dados. Esse modo é recomendado para o canal de validação (teste), mas não é tão eficiente para o canal de treinamento, quando você usa vários operadores.

    Nesse caso, você deseja que cada operador passe por uma parte diferente do conjunto de dados completo para fornecer gradientes diferentes nas épocas. Você especificará a distribuição como ShardedByS3Key para o canal de dados de treinamento da maneira a seguir.

    from sagemaker.session import s3_input
    s3_train = s3_input(s3_train_data, distribution='ShardedByS3Key') 
    ntm.fit({'train': s3_train, 'test': s3_val_data})
    

    A seguinte saída será exibida no terminal:

    Completed - Training job completed

    Êxito! Você treinou o modelo de tópicos com o algoritmo NTM.

    Na próxima etapa, você implantará o modelo nos serviços de hospedagem do Amazon Sagemaker.

  • Etapa 2. Implante o modelo de tópicos

    Um modelo treinado por si só não passa de um arquivo .tar com os pesos do modelo e não faz nada sozinho. Para tornar o modelo útil e obter previsões, você precisa implantar o modelo.

    Há duas maneiras de implantar o modelo no Amazon SageMaker, dependendo de como você deseja gerar inferências:

    • Para obter uma inferência por vez, configure um endpoint persistente usando serviços de hospedagem do Amazon SageMaker.
    • Para obter inferências para um conjunto de dados inteiro, use a transformação em lote do Amazon SageMaker.

    Este laboratório fornece as duas opções para você escolher a melhor abordagem para seu caso de uso.

    No caso dos serviços de hospedagem do Amazon SageMaker, um endpoint HTTPs ativo fica em uma instância do Amazon EC2 pela qual você pode passar uma carga útil e obter inferências.

    Ao implantar o modelo, você chame o método deploy do objeto sagemaker.estimator.Estimator. Ao chamar o método deploy, você especifica o número e o tipo de instâncias de ML que deseja usar para hospedar o endpoint.

    Copie e cole o código a seguir e escolha Executar para implantar o modelo.

    ntm_predictor = ntm.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')

    O método deploy cria o modelo implantável, configura o endpoint dos serviços de hospedagem do Amazon SageMaker e inicia o endpoint para hospedar o modelo.

    Para executar inferências em um endpoint, é necessário garantir que a carga útil de entrada seja serializada em um formato que o modelo treinado possa ler e que a saída de inferência seja desserializada em um formato legível por humanos. No código a seguir, use um csv_serializer e um json_deserializer que passa dados formatados em CSV (como vetores) ao modelo para produzir a saída JSON.

    Copie e cole o código a seguir em uma célula de código e escolha Executar.

    from sagemaker.predictor import csv_serializer, json_deserializer
    
    ntm_predictor.content_type = 'text/csv'
    ntm_predictor.serializer = csv_serializer
    ntm_predictor.deserializer = json_deserializer

    Em seguida, extraia os vetores de tópicos para os dados de treinamento que você usará no modelo K-NN.

    Copie e cole o código a seguir em uma nova célula de código e escolha Executar.

    predictions = []
    for item in np.array(vectors.todense()):
        np.shape(item)
        results = ntm_predictor.predict(item)
        predictions.append(np.array([prediction['topic_weights'] for prediction in results['predictions']]))
        
    predictions = np.array([np.ndarray.flatten(x) for x in predictions])
    topicvec = train_labels[newidx]
    topicnames = [categories[x] for x in topicvec]
    

    Êxito! Agora, você pode explorar as saídas do modelo.

    Com a transformação em lote, é possível executar inferências em um lote de dados de cada vez. O Amazon SageMaker cria a infraestrutura de computação necessária e a destrói quando o trabalho em lote é concluído.

    O código de transformação em lote cria um objeto sagemaker.transformer.Transformer a partir do modelo de tópicos. Em seguida, chama o método transform desse objeto para criar um trabalho de transformação. Ao criar o objeto sagemaker.transformer.Transformer , especifique o número e o tipo de instâncias a serem usadas para executar o trabalho de transformação em lote e o local no Amazon S3 em que deseja armazenar as inferências.  

    Para executar inferências como um trabalho em lote, copie e cole o código a seguir em uma nova célula de código e escolha Executar.

    np.savetxt('trainvectors.csv',
               vectors.todense(),
               delimiter=',',
               fmt='%i')
    batch_prefix = '20newsgroups/batch'
    
    train_s3 = sess.upload_data('trainvectors.csv', 
                                bucket=bucket, 
                                key_prefix='{}/train'.format(batch_prefix))
    print(train_s3)
    batch_output_path = 's3://{}/{}/test'.format(bucket, batch_prefix)
    
    ntm_transformer = ntm.transformer(instance_count=1,
                                      instance_type ='ml.m4.xlarge',
                                      output_path=batch_output_path
                                     )
    ntm_transformer.transform(train_s3, content_type='text/csv', split_type='Line')
    ntm_transformer.wait()
    

    Após a conclusão do trabalho de transformação, é possível usar o código a seguir para fazer o download das saídas de volta para a instância do bloco de anotações local para inspeção.

    !aws s3 cp --recursive $ntm_transformer.output_path ./
    !head -c 5000 trainvectors.csv.out

    Êxito! O modelo converteu cada documento em vetores de treinamento dimensional NUM_TOPICS. Agora, você pode explorar o modelo de tópicos.

  • Etapa 3. Explore o modelo de tópicos

    Uma abordagem para explorar as saídas do modelo é visualizar os vetores de tópicos gerados usando um gráfico T-SNE. T-SNE, ou Incorporação Estocástica de Vizinhança Distribuída em t, é uma técnica não linear para redução de dimensionalidade que visa garantir que a distância entre vizinhos mais próximos no espaço de alta dimensão original seja preservada no espaço de dimensão inferior resultante. Ao definir o número de dimensões como 2, ele pode ser usado como uma ferramenta de visualização para visualizar vetores de tópicos no espaço 2D.

    No seu bloco de anotações do Jupyter, copie e cole o código a seguir em uma nova célula de código e escolha Executar.

    from sklearn.manifold import TSNE
    time_start = time.time()
    tsne = TSNE(n_components=2, verbose=1, perplexity=50, n_iter=5000)
    tsne_results = tsne.fit_transform(predictions)
    print('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))
    tsnedf = pd.DataFrame()
    tsnedf['tsne-2d-one'] = tsne_results[:,0]
    tsnedf['tsne-2d-two'] = tsne_results[:,1]
    tsnedf['Topic']=topicnames
    plt.figure(figsize=(25,25))
    sns.lmplot(
        x="tsne-2d-one", y="tsne-2d-two",
        hue='Topic',
        palette=sns.color_palette("hls", NUM_TOPICS),
        data=tsnedf,
        legend="full",
        fit_reg=False
    )
    plt.axis('Off')
    plt.show()

    O gráfico TSNE deve mostrar alguns grandes clusters de tópicos conforme a imagem a seguir. Gráficos como esses podem ser usados para extrair o número de clusters de tópicos distintos do conjunto de dados. Atualmente, NUM_TOPICS está definido como 30, mas parece haver muitos tópicos próximos uns aos outros no gráfico TSNE que podem ser combinados em um único tópico. Por fim, como a modelagem de tópicos é em grande parte um problema de aprendizagem não supervisionada, você deve usar visualizações como essas para determinar qual é o número certo de tópicos para particionar o conjunto de dados.

    Tente experimentar diferentes números de tópicos para ver como é a visualização.


Neste módulo, você recuperou o algoritmo de Modelagem tópica neural (NTM) do Amazon SageMaker a partir do Amazon ECR. Em seguida, você especificou hiperparâmetros específicos do algoritmo e forneceu o bucket do Amazon S3 para armazenamento de artefatos. Depois, você implantou o modelo em um endpoint usando os serviços de hospedagem ou transformação em lote do Amazon SageMaker. Por fim, você explorou o modelo usando valores diferentes para o número do tópico.

No próximo módulo, você treinará e implantará o modelo de recomendações de conteúdo.