Agora que já sabemos como treinar e efetuar o deploy do modelo via Notebook, vamos criar um pipeline para automatizar o processo.
11.4.1 Testando tudo junto fase 1
O Primeiro passo é separar de forma lógia os steps.
Preparação dos dados
Treinamento do modelo
Deploy
Assim como fizemos no capítulo 10.3 vamos usar o notebook parar criar o pipeline para preparar os dados, treinar o modelo e efetuar o deploy.
Neste primeiro pipeline vamos criar algo simples com basicamente o código que vimos no capítulo 10.4. Essa primeira função é a fase de preparação de dados. Ela baixa os dados do minio e prepara os dados para a fase de treinamento:
defget_data():import pandas as pdfrom io import BytesIOfrom minio import Minioimport nltkfrom nltk.corpus import stopwords MINIO_HOST="minio-service.kubeflow:9000" MINIO_ACCESS_KEY="minio" MINIO_SECRET_KEY="minio123" MINIO_MODEL_BUCKET="kserve" MINIO_DATA_PRODUCT_PATH="data/produtos.csv" MINIO_DATA_PREP_PATH="data/prep.csv" INCOME_MODEL_PATH="sklearn/income/model" minioClient =Minio(MINIO_HOST, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, secure=False) obj = minioClient.get_object( MINIO_MODEL_BUCKET, MINIO_DATA_PRODUCT_PATH, ) nltk.download('stopwords') products_data = pd.read_csv(obj,delimiter=';', encoding='utf-8') products_data.count()# concatenando as colunas nome e descricao products_data['informacao']= products_data['nome']+ products_data['descricao']# excluindo linhas com valor de informacao ou categoria NaN products_data.dropna(subset=['informacao', 'categoria'], inplace=True) products_data.drop(columns=['nome', 'descricao'], inplace=True) stop_words=set(stopwords.words("portuguese"))# transforma a string em caixa baixa e remove stopwords products_data['sem_stopwords'] = products_data['informacao'].str.lower().apply(lambda x: ' '.join([word for word in x.split() if word not in (stop_words)]))
tokenizer = nltk.RegexpTokenizer(r"\w+") products_data['tokens']= products_data['sem_stopwords'].apply(tokenizer.tokenize)# aplica o regex tokenizer products_data.drop(columns=['sem_stopwords','informacao'],inplace=True)# Exclui as colunas antigas products_data["strings"]= products_data["tokens"].str.join(" ")# reunindo cada elemento da lista products_data.head() csv = products_data.to_csv(sep=';').encode('utf-8') minioClient.put_object( MINIO_MODEL_BUCKET, MINIO_DATA_PREP_PATH, data=BytesIO(csv), length=len(csv), content_type='application/csv' )
Depois vamos criar uma função para o treinamento de modelo:
deftraining():import pandas as pdimport minioimport nltkfrom nltk.corpus import stopwords from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.model_selection import train_test_splitfrom sklearn.pipeline import Pipelinefrom minio import Minioimport joblib MINIO_HOST="minio-service.kubeflow:9000" MINIO_ACCESS_KEY="minio" MINIO_SECRET_KEY="minio123" MINIO_MODEL_BUCKET="kserve" MINIO_DATA_PRODUCT_PATH="data/produtos.csv" MINIO_DATA_PREP_PATH="data/prep.csv" INCOME_MODEL_PATH="sklearn/income/model" nltk.download('stopwords') minioClient =Minio(MINIO_HOST, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, secure=False) obj = minioClient.get_object( MINIO_MODEL_BUCKET, MINIO_DATA_PREP_PATH, ) products_data = pd.read_csv(obj,delimiter=';', encoding='utf-8') X_train,X_test,y_train,y_test =train_test_split( # Separação dos dados para teste e treino products_data["strings"], products_data["categoria"], test_size =0.2, random_state =10 ) pipe =Pipeline([('vetorizador', CountVectorizer()), ("classificador", MultinomialNB())])# novo pipe.fit(X_train, y_train) joblib.dump(pipe, "model.joblib")print(minioClient.fput_object(MINIO_MODEL_BUCKET, f"{INCOME_MODEL_PATH}/model.joblib", 'model.joblib'))
Agora precisamos transformar as funções em componentes para usarmos dentro do pipeline do Kubeflow. Para isso vamos utilizar o componente create_component_from_func:
Veja que cada componente tem as próprias dependências de pacotes. O pipeline orquestra a chamada dos containiers de forma sequencial. Execute o seguinte comando para criar o pipeline e acompanhe na WebUI o resultado:
Agora que já vimos como o pipeline pode ajudar no processo de deploy de Machine Learning, vamos utilizar alguns componentes do Kubeflow pipeline para facilitar o processo.