def get_pai_explain_cmd(datasource, project, oss_model_path, model_name, data_table, result_table, model_type, model_params, job_file, params_file, label_column, cwd): """Get command to submit explain task to PAI Args: datasource: current datasource project: current project oss_model_path: the place to load model model_name: model used to do prediction data_table: data table from which to load explain data result_table: table to store prediction result model_type: type of th model, see also get_oss_saved_model_type model_params: parameters specified by WITH clause job_file: tar file incldue code and libs to execute on PAI params_file: extra params file lable_column: name of the label cwd: current working dir Returns: The command to submit a PAI explain task """ if model_type == EstimatorType.PAIML: cmd = get_explain_random_forests_cmd(datasource, model_name, data_table, result_table, label_column) else: conf = cluster_conf.get_cluster_config(model_params) cmd = get_pai_tf_cmd(conf, "file://" + os.path.join(cwd, JOB_ARCHIVE_FILE), "file://" + os.path.join(cwd, PARAMS_FILE), ENTRY_FILE, model_name, oss_model_path, data_table, "", result_table, project) return cmd
def test_get_pai_tf_cmd(self): conf = get_cluster_config({}) os.environ["SQLFLOW_OSS_CHECKPOINT_CONFIG"] = \ '\'\'\'{"arn":"arn", "host":"host"}\'\'\'' cmd = get_pai_tf_cmd.get_pai_tf_cmd( conf, "job.tar.gz", "params.txt", "entry.py", "my_dnn_model", "user1/my_dnn_model", "test_project.input_table", "test_project.val_table", "test_project.res_table", "test_project") expected = ( "pai -name tensorflow1150 -project algo_public_dev " "-DmaxHungTimeBeforeGCInSeconds=0 " "-DjobName=sqlflow_my_dnn_model -Dtags=dnn -Dscript=job.tar.gz " "-DentryFile=entry.py " "-Dtables=odps://test_project/tables/input_table," "odps://test_project/tables/val_table " "-Doutputs=odps://test_project/tables/res_table " "-DhyperParameters='params.txt' " "-DcheckpointDir='oss://sqlflow-models/user1/my_dnn_model/?" "role_arn=arn/pai2osstestproject&host=host' " "-DgpuRequired='0'") self.assertEqual(expected, cmd) conf = get_cluster_config({"train.num_workers": 5}) cmd = get_pai_tf_cmd.get_pai_tf_cmd( conf, "job.tar.gz", "params.txt", "entry.py", "my_dnn_model", "user1/my_dnn_model", "test_project.input_table", "test_project.val_table", "test_project.res_table", "test_project") expected = ( "pai -name tensorflow1150 -project algo_public_dev " "-DmaxHungTimeBeforeGCInSeconds=0 " "-DjobName=sqlflow_my_dnn_model -Dtags=dnn -Dscript=job.tar.gz " "-DentryFile=entry.py " "-Dtables=odps://test_project/tables/input_table," "odps://test_project/tables/val_table " "-Doutputs=odps://test_project/tables/res_table " "-DhyperParameters='params.txt' " "-DcheckpointDir='oss://sqlflow-models/user1/my_dnn_model/?" "role_arn=arn/pai2osstestproject&host=host' " r'''-Dcluster="{\"ps\": {\"count\": 1, \"cpu\": 200, \"gpu\": 0}''' r''', \"worker\": {\"count\": 5, \"cpu\": 400, \"gpu\": 0}}"''') self.assertEqual(expected, cmd) del os.environ["SQLFLOW_OSS_CHECKPOINT_CONFIG"]
def submit_pai_evaluate(datasource, model_name, select, result_table, model_attrs, user=""): """Submit a PAI evaluation task Args: datasource: current datasource model_name: model used to do evaluation select: sql statement to get evaluate data set result_table: the table name to save result model_params: dict, Params for training, crossponding to WITH claus """ params = dict(locals()) cwd = tempfile.mkdtemp(prefix="sqlflow", dir="/tmp") project = table_ops.get_project(datasource) if result_table.count(".") == 0: result_table = "%s.%s" % (project, result_table) oss_model_path = pai_model.get_oss_model_save_path(datasource, model_name, user=user) params["oss_model_path"] = oss_model_path model_type, estimator = pai_model.get_oss_saved_model_type_and_estimator( oss_model_path, project) if model_type == EstimatorType.PAIML: raise SQLFlowDiagnostic("PAI model evaluation is not supported yet.") data_table = table_ops.create_tmp_table_from_select(select, datasource) params["data_table"] = data_table metrics = get_evaluate_metrics(model_type, model_attrs) params["metrics"] = metrics create_evaluate_result_table(datasource, result_table, metrics) conf = cluster_conf.get_cluster_config(model_attrs) if model_type == EstimatorType.XGBOOST: params["entry_type"] = "evaluate_xgb" else: params["entry_type"] = "evaluate_tf" prepare_archive(cwd, estimator, oss_model_path, params) cmd = get_pai_tf_cmd(conf, "file://" + os.path.join(cwd, JOB_ARCHIVE_FILE), "file://" + os.path.join(cwd, PARAMS_FILE), ENTRY_FILE, model_name, oss_model_path, data_table, "", result_table, project) submit_pai_task(cmd, datasource) table_ops.drop_tables([data_table], datasource)
def get_pai_predict_cmd(datasource, project, oss_model_path, model_name, predict_table, result_table, model_type, model_params, job_file, params_file, cwd): """Get predict command for PAI task Args: datasource: current datasource project: current project oss_model_path: the place to load model model_name: model used to do prediction predict_table: where to store the tmp prediction data set result_table: prediction result model_type: type of th model, see also get_oss_saved_model_type model_params: parameters specified by WITH clause job_file: tar file incldue code and libs to execute on PAI params_file: extra params file cwd: current working dir Returns: The command to submit PAI prediction task """ # NOTE(typhoonzero): for PAI machine learning toolkit predicting, we can # not load the TrainStmt since the model saving is fully done by PAI. # We directly use the columns in SELECT statement for prediction, error # will be reported by PAI job if the columns not match. conf = cluster_conf.get_cluster_config(model_params) conn = db.connect_with_data_source(datasource) if model_type == EstimatorType.PAIML: schema = db.get_table_schema(conn, predict_table) result_fields = [col[0] for col in schema] return ('''pai -name prediction -DmodelName="%s" ''' '''-DinputTableName="%s" -DoutputTableName="%s" ''' '''-DfeatureColNames="%s" -DappendColNames="%s"''') % ( model_name, predict_table, result_table, ",".join(result_fields), ",".join(result_fields)) else: schema = db.get_table_schema(conn, result_table) result_fields = [col[0] for col in schema] # For TensorFlow and XGBoost, we build a pai-tf cmd to submit the task return get_pai_tf_cmd(conf, job_file, params_file, ENTRY_FILE, model_name, oss_model_path, predict_table, "", result_table, project)
def get_pai_train_cmd(datasource, estimator_string, model_name, train_table, val_table, model_params, train_params, path_to_save, job_file, params_file, cwd): """Get train model comman for PAI Args: datasource: current datasource estimator_string: estimator name, Keras class name, or XGBoost model_name: the model name to train train_table: data table from which to load train data val_table: data table from which to load evaluate data model_params: params for training, crossponding to WITH clause train_params: parmas for the trainning process path_to_save: path to save the model job_file: tar file incldue code and libs to execute on PAI params_file: extra params file cwd: current working dir Returns: The command to submit a PAI train task """ project = table_ops.get_project(datasource) conf = cluster_conf.get_cluster_config(model_params) if estimator_string.lower() == "randomforests": cmd = get_train_random_forest_pai_cmd( model_name, train_table, model_params, train_params["feature_column_names"], train_params["label_meta"]["feature_name"]) elif estimator_string.lower() == "kmeans": cmd = get_train_kmeans_pai_cmd(datasource, model_name, train_table, model_params, train_params["feature_column_names"]) else: cmd = get_pai_tf_cmd(conf, job_file, params_file, ENTRY_FILE, model_name, path_to_save, train_table, val_table, "", project) return cmd
def submit_pai_evaluate(datasource, original_sql, select, label_name, model, model_params, result_table, user=""): """Submit a PAI evaluation task Args: datasource: string Like: maxcompute://ak:[email protected]/api? curr_project=test_ci&scheme=http original_sql: string Original "TO PREDICT" statement. select: string SQL statement to get prediction data set. model: string Model to load and do prediction. label_name: string The label name to evaluate. model_params: dict Params for training, crossponding to WITH clause. result_table: string The table name to save prediction result. user: string A string to identify the user, used to load model from the user's directory. """ params = dict(locals()) project = table_ops.get_project(datasource) if result_table.count(".") == 0: result_table = "%s.%s" % (project, result_table) params["result_table"] = result_table oss_model_path = pai_model.get_oss_model_save_path(datasource, model, user=user) model_type, estimator = pai_model.get_saved_model_type_and_estimator( datasource, model) if model_type == EstimatorType.PAIML: raise SQLFlowDiagnostic("PAI model evaluation is not supported yet.") if model_type == EstimatorType.XGBOOST: params["entry_type"] = "evaluate_xgb" validation_metrics = model_params.get("validation.metrics", "accuracy_score") else: params["entry_type"] = "evaluate_tf" validation_metrics = model_params.get("validation.metrics", "Accuracy") validation_metrics = [m.strip() for m in validation_metrics.split(",")] with db.connect_with_data_source(datasource) as conn: result_column_names = create_evaluate_table(conn, result_table, validation_metrics) with table_ops.create_tmp_tables_guard(select, datasource) as data_table: params["pai_table"] = data_table params["result_column_names"] = result_column_names if try_pai_local_run(params, oss_model_path): return conf = cluster_conf.get_cluster_config(model_params) with temp_file.TemporaryDirectory(prefix="sqlflow", dir="/tmp") as cwd: prepare_archive(cwd, estimator, oss_model_path, params) cmd = get_pai_tf_cmd( conf, "file://" + os.path.join(cwd, JOB_ARCHIVE_FILE), "file://" + os.path.join(cwd, PARAMS_FILE), ENTRY_FILE, model, oss_model_path, data_table, "", result_table, project) submit_pai_task(cmd, datasource)
def submit_pai_evaluate(datasource, original_sql, select, model_name, model_params, result_table, user=""): """Submit a PAI evaluation task Args: datasource: string Like: maxcompute://ak:[email protected]/api? curr_project=test_ci&scheme=http original_sql: string Original "TO PREDICT" statement. select: string SQL statement to get prediction data set. model_name: string Model to load and do prediction. model_params: dict Params for training, crossponding to WITH clause. result_table: string The table name to save prediction result. user: string A string to identify the user, used to load model from the user's directory. """ params = dict(locals()) cwd = tempfile.mkdtemp(prefix="sqlflow", dir="/tmp") project = table_ops.get_project(datasource) if result_table.count(".") == 0: result_table = "%s.%s" % (project, result_table) params["result_table"] = result_table oss_model_path = pai_model.get_oss_model_save_path(datasource, model_name, user=user) params["oss_model_path"] = oss_model_path model_type, estimator = pai_model.get_oss_saved_model_type_and_estimator( oss_model_path, project) if model_type == EstimatorType.PAIML: raise SQLFlowDiagnostic("PAI model evaluation is not supported yet.") data_table = table_ops.create_tmp_table_from_select(select, datasource) params["data_table"] = data_table metrics = get_evaluate_metrics(model_type, model_params) params["metrics"] = metrics create_evaluate_result_table(datasource, result_table, metrics) conf = cluster_conf.get_cluster_config(model_params) if model_type == EstimatorType.XGBOOST: params["entry_type"] = "evaluate_xgb" else: params["entry_type"] = "evaluate_tf" prepare_archive(cwd, estimator, oss_model_path, params) cmd = get_pai_tf_cmd(conf, "file://" + os.path.join(cwd, JOB_ARCHIVE_FILE), "file://" + os.path.join(cwd, PARAMS_FILE), ENTRY_FILE, model_name, oss_model_path, data_table, "", result_table, project) submit_pai_task(cmd, datasource) table_ops.drop_tables([data_table], datasource)