176 lines
6.6 KiB
Python
176 lines
6.6 KiB
Python
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
"""
|
|
RUN PaddleNLP CI Case
|
|
"""
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def get_mode_info(case_path):
|
|
"""
|
|
Return: model_info{path,exec_file_list}
|
|
Examples:
|
|
pegasus = {
|
|
"path": "applications/text_summarization/pegasus/"
|
|
"deploy_path": "deploy/paddle_inference/"
|
|
"prepare": "run_prepare.py"
|
|
"train_exec_file": "train.py"
|
|
"eval_exec_file": None
|
|
"predict_exec_file": predict.py
|
|
“export_exec_file”: export_model.py
|
|
"infer_exec_file": inference_pegasus.py
|
|
}
|
|
"""
|
|
model_info = {
|
|
"path": case_path,
|
|
"deploy_path": None,
|
|
"prepare_exec_file": None,
|
|
"train_exec_file": [],
|
|
"eval_exec_file": None,
|
|
"predict_exec_file": None,
|
|
"export_exec_file": None,
|
|
"infer_exec_file": None,
|
|
}
|
|
for root, dirs, files in os.walk(case_path):
|
|
infer_deploy_path = case_path + "/deploy/paddle_inference"
|
|
python_deploy_path = case_path + "/deploy/python"
|
|
|
|
if files and root == case_path:
|
|
for file in files:
|
|
# TODO .sh file incompatible windows
|
|
if file.split(".")[-1] == "py":
|
|
if re.compile("prepare.py").findall(file):
|
|
model_info["prepare_exec_file"] = file
|
|
|
|
elif re.compile("train.py").findall(file):
|
|
model_info["train_exec_file"].append(file)
|
|
|
|
elif re.compile("finetune").findall(file):
|
|
model_info["train_exec_file"].append(file)
|
|
|
|
elif re.compile("eval.py").findall(file):
|
|
model_info["eval_exec_file"] = file
|
|
|
|
elif re.compile("predict.py").findall(file):
|
|
model_info["predict_exec_file"] = file
|
|
|
|
elif re.compile("export_model.py").findall(file):
|
|
model_info["export_exec_file"] = file
|
|
|
|
elif re.compile("run_").findall(file):
|
|
model_info["train_exec_file"].append(file)
|
|
else:
|
|
continue
|
|
elif files and root == infer_deploy_path:
|
|
for file in files:
|
|
if file.split(".")[-1] == "py":
|
|
model_info["deploy_path"] = "deploy/paddle_inference"
|
|
model_info["infer_exec_file"] = file
|
|
elif files and root == python_deploy_path:
|
|
for file in files:
|
|
if file.split(".")[-1] == "py":
|
|
model_info["deploy_path"] = "deploy/python"
|
|
model_info["infer_exec_file"] = file
|
|
|
|
print("model_info", model_info)
|
|
return model_info
|
|
|
|
|
|
def save_log(exit_code, output, case_name, file_name):
|
|
"""
|
|
save model log
|
|
"""
|
|
root_path = "/workspace/PaddleNLP"
|
|
# root_path = '/ssd1/paddlenlp/zhangjunjun/PaddleNLP'
|
|
if exit_code == 0:
|
|
log_file = root_path + "/model_logs/" + os.path.join(case_name + "_" + file_name + "_SUCCESS.log")
|
|
print("{} SUCCESS".format(file_name))
|
|
with open(log_file, "a") as flog:
|
|
flog.write("%s" % (output))
|
|
else:
|
|
log_file = root_path + "/model_logs/" + os.path.join(case_name + "_" + file_name + "_FAIL.log")
|
|
print("{} FAIL".format(file_name))
|
|
with open(log_file, "a") as flog:
|
|
flog.write("%s" % (output))
|
|
|
|
|
|
def run_normal_case(case_path):
|
|
"""
|
|
Run new normal case
|
|
params:
|
|
case_path: model path based PaddleNLP from git diff
|
|
"""
|
|
case_name = case_path.split("/")[-1]
|
|
model_info = get_mode_info(case_path)
|
|
deploy_path = model_info["deploy_path"]
|
|
prepare_exec_file = model_info["prepare_exec_file"]
|
|
eval_exec_file = model_info["eval_exec_file"]
|
|
predict_exec_file = model_info["predict_exec_file"]
|
|
export_exec_file = model_info["export_exec_file"]
|
|
infer_exec_file = model_info["infer_exec_file"]
|
|
|
|
os.chdir(case_path)
|
|
|
|
if prepare_exec_file:
|
|
prepare_output = subprocess.getstatusoutput("python %s " % (prepare_exec_file))
|
|
save_log(prepare_output[0], prepare_output[1], case_name, prepare_exec_file.split(".")[0])
|
|
|
|
if model_info["train_exec_file"]:
|
|
for train_file in model_info["train_exec_file"]:
|
|
train_output = subprocess.getstatusoutput(
|
|
"python -m paddle.distributed.launch %s --device gpu --max_steps 2 \
|
|
--save_steps 2 --output_dir ./output/"
|
|
% (train_file)
|
|
)
|
|
save_log(train_output[0], train_output[1], case_name, train_file.split(".")[0])
|
|
else:
|
|
print("Train Skipped")
|
|
|
|
if eval_exec_file:
|
|
eval_output = subprocess.getstatusoutput("python %s --init_checkpoint_dir ./output/" % (eval_exec_file))
|
|
save_log(eval_output[0], eval_output[1], case_name, eval_exec_file.split(".")[0])
|
|
else:
|
|
print("Evaluation Skipped")
|
|
if predict_exec_file:
|
|
predict_output = subprocess.getstatusoutput("python %s --init_checkpoint_dir ./output/" % (predict_exec_file))
|
|
save_log(predict_output[0], predict_output[1], case_name, predict_exec_file.split(".")[0])
|
|
else:
|
|
print("Predict Skipped")
|
|
if export_exec_file:
|
|
export_output = subprocess.getstatusoutput(
|
|
"python %s --export_output_dir ./inference_model/" % (export_exec_file)
|
|
)
|
|
save_log(export_output[0], export_output[1], case_name, export_exec_file.split(".")[0])
|
|
else:
|
|
print("Export model Skipped")
|
|
if infer_exec_file:
|
|
infer_output = subprocess.getstatusoutput(
|
|
"cd %s && python %s --inference_model_dir ../../inference_model/" % (deploy_path, infer_exec_file)
|
|
)
|
|
save_log(infer_output[0], infer_output[1], case_name, infer_exec_file.split(".")[0])
|
|
else:
|
|
print("python inference Skipped")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# path ="applications/text_summarization/pegasus"
|
|
path = sys.argv[1]
|
|
if os.path.isdir(path):
|
|
run_normal_case(path)
|
|
else:
|
|
print("not model file path, skepped ")
|