Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Dhuolib é uma biblioteca projetada para gerenciar o ciclo de vida de modelos de machine learning de forma rápida e eficaz. Com a Dhuolib, é possível implementar e gerenciar ciclos de deploy, controle de versões e gerenciamento de modelos em predição de maneira simples e intuitiva. Este documento tem como objetivo demonstrar essas funcionalidades, facilitando o uso da ferramenta e potencializando sua eficiência.
==versão: 0.7.7==
https://pypi.org/project/dhuodata-lib/
Nesta sessão serão abordadas as principais funcionalidades presentes na dhuolib
A análise exploratória de dados envolve a persistência e aquisição de dados de forma eficiente. Utiliza métodos para inserção direta de dados, atualização de tabelas com DataFrames, recuperação paginada de registros e conversão de resultados em DataFrames, facilitando o trabalho dos desenvolvedores na predição de modelos de machine learning.
A classe GenericRepository Simplifica o uso e o acesso ao datalake. Possui diversos métodos, incluindo inserção e busca de dados. Seu objetivo é facilitar o trabalho dos desenvolvedores no processo de predição de modelos de machine learning, fornecendo uma interface simplificada para a interação com os dados.
O repositorio é iniciado passando uma conexão com o banco de dados como parametro no construtor
Cria uma tabela baseada em um dataframe existente
Example:
df = pd.DataFrame({"name": ["example"], "value": [42]})
number_lines = repo.create_table_by_dataframe("my_table", data)
Atualiza uma tabela adicionando ou substituindo registros usando um DataFrame do pandas.
Parâmetros:
table_name: O nome da tabela a ser atualizada.
dataframe: Um DataFrame do pandas contendo os registros a serem inseridos.
if_exists: Especifica o comportamento se a tabela já existir, podendo ser replace ou append. O padrão é "append" .
is_update_version: Faz update da versão do dado a ser inserido na tabela que vai receber o resultado da predição . A table precisa ter três colunas ==PREDICT, CREATED_AT e VERSION.==
Example:
df = pd.DataFrame({"name": ["example"], "value": [42]})
repo.update_table_by_dataframe("my_table", df)
to_dataframe(self, table_name: str = None, filter_clause: str = None, list_columns: list = None)
Converte os resultados da consulta em um DataFrame do pandas.
Parâmetros:
Retorna:
Exemplo:
df = repo.to_dataframe("my_table", filter_clause="value > 10", list_columns=["name", "value"])
DhuolibExperimentClient interage com o serviço Dhuolib para gerenciar experimentos, executar modelos, criar modelos e fazer previsões. Inclui métodos para criar e executar experimentos, criar modelos e fazer previsões em lote.
Inicializa o cliente com um endpoint de serviço.
Cria um novo experimento com o nome e tags especificados.
Exemplo:
experiment_response = dholib_client.create_experiment(
experiment_name="iris-classification", experiment_tags={"tag": "iris"}
)
Executa um experimento com o modelo e requisitos especificados.
Parâmetros:
Retorna:
Exemplo:
experiment_run = dholib_client.execute_run_for_experiment(
type_model="lightgbm",
experiment_name="lighhtgbm-iris-classification053",
tags={"version": "v2", "priority": "P2"},
modelpkl_path="{path}/iris.pkl",
requirements_path="{path}/requirements.txt"
)
Cria um novo modelo com os parâmetros especificados.
Exemplo:
dholib_client.create_model(modelname="iris-classification",
stage="Production",
run_id=experiment_run["run_id"],
model_uri=experiment_run["model_uri"],
tags={"type_model": "lightgbm"})
Identificadores:
extra key
").Comparadores para atributos de string e tags:
Comparadores para atributos numéricos:
Operadores Lógicos:
results = dholib_client.search_experiments(
filter_string="tags.version LIKE 'v%'", max_results=10
)
results = dholib_client.search_experiments(
filter_string="tags.version='v1'", max_results=2
)
print("All Experiments:")
for result in results["experiments"]:
print(result)
Comparadores para atributos de string e tags:
Comparadores para atributos numéricos:
Operadores Lógicos:
dholib_client = DhuolibExperimentMLClient(service_uri)
print("Runs:")
results = dholib_client.search_runs(
experiment_name="wine-regression",
filter_string="tags.type_model='keras'",
max_results=2,
)
for result in results["runs"]:
print(result)
max_results: Número máximo de resultados a serem retornados.
page_token: Token da página para busca paginada.
filter_string: String de consulta de filtro (por exemplo, "name = 'a_model_name' and tag.key = 'value1'"), por padrão, busca todas as versões de modelos. Os seguintes identificadores, comparadores e operadores lógicos são suportados.
Identificadores:
extra key
").Comparadores:
Operadores Lógicos:
results = dholib_client.search_models(
filter_string="tags.version='v1'", max_results=2
)
Faz a transição dos modelos para diferentes ambientes por padrão o valor é None. Existem outros ambientes tambem Production, Stagging ou Archive.
Faz o download de um determinado pkl.
Exemplo:
batch_params = {
"modelname": "iris-classification-lightgbm",
"stage": "Production",
"experiment_name": "iris-classification",
"type_model": "lightgbm",
"run_id": "",
"batch_model_dir": "iris.pkl",
}
response = client.download_pkl(batch_params)
Faz uma previsão em lote usando um DataFrame do pandas.
Exemplo:
batch_params = {
"modelname": "iris-classification-lightgbm",
"stage": "Production",
"experiment_name": "iris-classification",
"type_model": "lightgbm",
"run_id": "121",
"batch_model_dir": "iris.pkl",
}
response = client.prediction_batch_with_dataframe(batch_params, dataframe)
import pickle
import lightgbm as lgb
from dhuolib.clients.experiment import DhuolibExperimentMLClient
from dhuolib.repository import DatabaseConnection, GenericRepository
def get_repository(config_file_name):
if not config_file_name:
raise ValueError("config_file_name is required")
db = DatabaseConnection(config_file_name=config_file_name)
repository = GenericRepository(db_connection=db)
return repository
def train():
service_uri = "https://dhuo-data-api-data-service-stg.br.engineering"
dholib_client = DhuolibExperimentMLClient(
service_uri=service_uri,
token="{token}"
)
repository = get_repository(
config_file_name="{path}/config/database.json"
)
df_iris_train = repository.to_dataframe(table_name="IRIS_TRAIN")
print(df_iris_train.columns)
X = df_iris_train[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
y = df_iris_train["class"]
clf = lgb.LGBMClassifier()
clf.fit(X, y)
with open("iris.pkl", "wb") as f:
pickle.dump(clf, f)
dholib_client.create_experiment(
experiment_name="lightgbm-iris", experiment_tags={"tag": "iris"}
)
experiment_run = dholib_client.execute_run_for_experiment(
type_model="lightgbm",
experiment_name="lightgbm-iris",
tags={"version": "v2", "priority": "P2"},
modelpkl_path="{path}/iris.pkl",
requirements_path="{path}/requirements.txt",
)
print(experiment_run)
result = dholib_client.create_model(
modelname="iris-classification",
stage="Production",
run_id=experiment_run["run_id"],
model_uri=experiment_run["model_uri"],
tags={"type_model": "lightgbm"},
)
print(result)
if __name__ == "__main__":
train()
DhuolibPlatformClient interage com o serviço Dhuolib para gerenciar projetos em lote, implantar scripts, verificar o status do pipeline, criar clusters e executar pipelines em lote.
Inicializa o cliente com um endpoint de serviço e um nome de projeto opcional.
Cria um novo projeto em lote com o nome especificado.
Parâmetros:
Retorna:
Lança:
ValueError
: Se o projeto já existir.ConnectionError
: Se houver um erro de conexão.Exemplo:
response = dholib_platform.create_batch_project("MeuProjeto")
Implanta um projeto em lote com o script e requisitos especificados.
Exemplo:
response = dholib_platform.deploy_batch_project(
script_filename="{path}/script.py",
requirements_filename="{path}/requirements.txt"
)
Gera um relatório de status do pipeline para o projeto em lote.
Retorna:
Lança:
Exemplo:
status_report = dholib_platform.pipeline_status_report()
Cria um cluster com o tamanho especificado para o projeto em lote.
Parâmetros:
Retorna:
Lança:
Exemplo:
response = dholib_platform.create_cluster(2)
Executa o pipeline em lote para o projeto.
Retorna:
Lança:
Exemplo:
response = dholib_platform.batch_run()
schedule_batch_run(self, project_name: str, schedule_interval: str):
Cria o agendamento de execução de um processamento em batch
Parâmetros:
Lança:
Retorna:
Exemplo:
dholib_platform.schedule_batch_run(
project_name="lightgbm-iris",
schedule_interval="*/5 * * * *"
)
Deleta o agendamento de execução de um determinado projeto
Parâmetros:
Lança:
Retorna:
dholib_platform.remove_schedule(project_name="lightgbm-iris")
Para utilizar o Dhuolib para predição em batch usando o Data Lake, é necessário ter duas fontes de dados. A primeira fonte contém as features com os valores para treinamento e a segunda fonte contém os valores que serão usados para a inferência. Exemplos dessas fontes podem ser as tabelas: IRIS_TRAIN para treinamento e IRIS_DATA_FOR_INFERENCY para inferência.
Os dados para inferência e os dados de treinamento podem ser substituídos por DataFrames pandas obtidos de outras fontes. Ao salvar os dados no Data Lake, é importante ter em mente que a tabela deve conter, no mínimo, três colunas obrigatórias: ==PREDICT, CREATED_AT e VERSION.==
CREATE TABLE "DHUODATA"."IRIS_OUTPUT"
(
"SEPAL_LENGTH" NUMBER,
"SEPAL_WIDTH" NUMBER,
"PETAL_LENGTH" NUMBER,
"PETAL_WIDTH" NUMBER,
"PREDICT" NUMBER(*,0),
"VERSION" NUMBER(*,0),
"CREATED_AT" TIMESTAMP (6)
);
Ao garantir que essas colunas estejam presentes, você assegura a integridade e a rastreabilidade dos dados no Data Lake, facilitando o monitoramento e a manutenção do pipeline de predição.
import pickle
import lightgbm as lgb
from dhuolib.clients.experiment import DhuolibExperimentMLClient
from dhuolib.repository import DatabaseConnection, GenericRepository
def get_repository(config_file_name):
if not config_file_name:
raise ValueError("config_file_name is required")
db = DatabaseConnection(config_file_name=config_file_name)
repository = GenericRepository(db_connection=db)
return repository
def train():
service_uri = ""
dholib_client = DhuolibExperimentMLClient(service_uri=service_uri)
repository = get_repository(
config_file_name="{path}/database.json"
)
df_iris_train = repository.to_dataframe(table_name="IRIS_TRAIN")
print(df_iris_train.columns)
X = df_iris_train[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
y = df_iris_train["class"]
clf = lgb.LGBMClassifier()
clf.fit(X, y)
with open("iris.pkl", "wb") as f:
pickle.dump(clf, f)
dholib_client.create_experiment(
experiment_name="lightgbm-iris", experiment_tags={"tag": "iris"}
)
experiment_run = dholib_client.execute_run_for_experiment(
type_model="lightgbm",
experiment_name="lightgbm-iris",
tags={"version": "v2", "priority": "P2"},
modelpkl_path=f"{path}/iris.pkl",
requirements_path=f"{path}/requirements.txt",
)
print(experiment_run)
result = dholib_client.create_model(
modelname="iris-classification",
stage="Production",
run_id=experiment_run["run_id"],
model_uri=experiment_run["model_uri"],
tags={"type_model": "lightgbm"},
)
print(result)
if __name__ == "__main__":
train()
Obs: O nome deve ser sempre script.py
from dhuolib.clients.experiment import DhuolibExperimentMLClient
from dhuolib.repository import DatabaseConnection, GenericRepository
def get_repository(config_file_name):
if not config_file_name:
raise ValueError("config_file_name is required")
db = DatabaseConnection(config_file_name=config_file_name)
repository = GenericRepository(db_connection=db)
return repository
def predict():
service_uri = ""
dholib_client = DhuolibExperimentMLClient(service_uri=service_uri)
repository = get_repository(
config_file_name="{path}/database.json"
)
df_iris = repository.to_dataframe(
table_name="IRIS_FEATURE",
list_columns=["SEPAL_LENGTH", "SEPAL_WIDTH", "PETAL_LENGTH", "PETAL_WIDTH"],
)
print(df_iris.head(10))
batch_params = {
"modelname": "iris-classification-lightgbm",
"stage": "Production",
"experiment_name": "lightgbm-iris",
"type_model": "lightgbm",
"run_id": "",
"batch_model_dir": "iris.pkl",
}
predicts = dholib_client.prediction_batch_with_dataframe(
batch_params=batch_params, df=df_iris
)
df_iris["predict"] = predicts
repository.update_table_by_dataframe(
table_name="iris_output", df_predict=df_iris, is_update_version=True
)
if __name__ == "__main__":
predict()
dholib_platform.create_batch_project - Crie o projeto
from dhuolib.clients.platform import DhuolibPlatformClient
dholib_platform = DhuolibPlatformClient(service_endpoint="http://{endpoint}", project_name="lightgbm-iris")
dholib_platform.create_batch_project('lightgbm-iris')
dholib_platform.deploy_batch_project - Faça o deploy do projeto. Lembre de passar o caminho do script e o caminho do requirements
response = dholib_platform.deploy_batch_project(
script_filename="{path}/script.py",
requirements_filename="{path}/requirements.txt"
)
dholib_platform.pipeline_status_report - Verifique os status da execução
dholib_platform.pipeline_status_report()
from dhuolib.clients.platform import DhuolibPlatformClient
dholib_platform = DhuolibPlatformClient(
service_uri="http://dhuo-data-api-data-service.br.engineering",
project_name="lightgbm-iris",
)
dholib_platform.create_cluster - Crie o cluster. O cluster possui 3 niveis de capacidade. SMALL(1), MEDIUM(2) ou LARGE(3).
response_create_cluster = dholib_platform.create_cluster(1)
dholib_platform.batch_run - Execute o script do projeto
response_batch_run = dholib_platform.batch_run()
FAQs
Unknown package
We found that dhuodata-lib demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.