|
|
@@ -1,8 +1,10 @@ |
|
|
|
package repo |
|
|
|
|
|
|
|
import ( |
|
|
|
"bufio" |
|
|
|
"encoding/json" |
|
|
|
"errors" |
|
|
|
"io" |
|
|
|
"io/ioutil" |
|
|
|
"net/http" |
|
|
|
"os" |
|
|
@@ -22,6 +24,10 @@ import ( |
|
|
|
uuid "github.com/satori/go.uuid" |
|
|
|
) |
|
|
|
|
|
|
|
const ( |
|
|
|
tplModelSafetyTestCreate = "repo/modelsafety/new" |
|
|
|
) |
|
|
|
|
|
|
|
func CloudBrainAiSafetyCreateTest(ctx *context.Context) { |
|
|
|
log.Info("start to create CloudBrainAiSafetyCreate") |
|
|
|
uuid := uuid.NewV4() |
|
|
@@ -57,34 +63,148 @@ func CloudBrainAiSafetyCreateTest(ctx *context.Context) { |
|
|
|
|
|
|
|
func GetAiSafetyTask(ctx *context.Context) { |
|
|
|
var ID = ctx.Params(":jobid") |
|
|
|
task, err := models.GetCloudbrainByJobIDWithDeleted(ID) |
|
|
|
getAiSafetyTaskStatusFromCloudbrain(ID) |
|
|
|
} |
|
|
|
|
|
|
|
func getAiSafetyTaskStatusFromCloudbrain(ID string) { |
|
|
|
job, err := models.GetCloudbrainByJobIDWithDeleted(ID) |
|
|
|
if err != nil { |
|
|
|
log.Error("GetCloudbrainByJobID failed:" + err.Error()) |
|
|
|
ctx.NotFound(ctx.Req.URL.RequestURI(), nil) |
|
|
|
return |
|
|
|
} |
|
|
|
if task.Type == models.TypeCloudBrainTwo { |
|
|
|
if job.Type == models.TypeCloudBrainTwo { |
|
|
|
|
|
|
|
} else if job.Type == models.TypeCloudBrainOne { |
|
|
|
if isTaskNotFinished(job.Status) { |
|
|
|
log.Info("The task not finished,name=" + job.DisplayJobName) |
|
|
|
jobResult, err := cloudbrain.GetJob(job.JobID) |
|
|
|
|
|
|
|
result, err := models.ConvertToJobResultPayload(jobResult.Payload) |
|
|
|
if err != nil { |
|
|
|
log.Error("ConvertToJobResultPayload failed:", err) |
|
|
|
return |
|
|
|
} |
|
|
|
job.Status = result.JobStatus.State |
|
|
|
if result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobFailed) { |
|
|
|
taskRoles := result.TaskRoles |
|
|
|
taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) |
|
|
|
job.Status = taskRes.TaskStatuses[0].State |
|
|
|
} |
|
|
|
|
|
|
|
if result.JobStatus.State != string(models.JobSucceeded) { |
|
|
|
err = models.UpdateJob(job) |
|
|
|
if err != nil { |
|
|
|
log.Error("UpdateJob failed:", err) |
|
|
|
} |
|
|
|
} else { |
|
|
|
// |
|
|
|
job.Status = string(models.ModelSafetyTesting) |
|
|
|
err = models.UpdateJob(job) |
|
|
|
if err != nil { |
|
|
|
log.Error("UpdateJob failed:", err) |
|
|
|
} |
|
|
|
//send msg to beihang |
|
|
|
sendGpuInferenceResultToTest(job) |
|
|
|
} |
|
|
|
|
|
|
|
} else if task.Type == models.TypeCloudBrainOne { |
|
|
|
} else { |
|
|
|
if job.Status == string(models.ModelSafetyTesting) { |
|
|
|
// |
|
|
|
result, err := aisafety.GetTaskStatus(job.PreVersionName) |
|
|
|
if err == nil { |
|
|
|
if result["code"] != nil { |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func isTaskFinished(status string) bool { |
|
|
|
func sendGpuInferenceResultToTest(job *models.Cloudbrain) { |
|
|
|
datasetname := job.DatasetName |
|
|
|
datasetnames := strings.Split(datasetname, ";") |
|
|
|
indicator := job.LabelName |
|
|
|
|
|
|
|
req := aisafety.TaskReq{ |
|
|
|
UnionId: job.JobID, |
|
|
|
EvalName: job.DisplayJobName, |
|
|
|
EvalContent: job.Description, |
|
|
|
TLPath: "test", |
|
|
|
Indicators: strings.Split(indicator, ";"), |
|
|
|
CDName: datasetnames[1], |
|
|
|
BDName: datasetnames[0], |
|
|
|
} |
|
|
|
|
|
|
|
resultDir := "/model" |
|
|
|
prefix := "/" + setting.CBCodePathPrefix + job.JobName + resultDir |
|
|
|
files, err := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, "") |
|
|
|
if err != nil { |
|
|
|
log.Error("query cloudbrain one model failed: %v", err) |
|
|
|
return |
|
|
|
} |
|
|
|
jsonContent := "" |
|
|
|
for _, file := range files { |
|
|
|
if strings.HasSuffix(file.FileName, "result.json") { |
|
|
|
path := storage.GetMinioPath(job.JobName+resultDir+"/", file.FileName) |
|
|
|
log.Info("path=" + path) |
|
|
|
reader, err := os.Open(path) |
|
|
|
defer reader.Close() |
|
|
|
if err == nil { |
|
|
|
r := bufio.NewReader(reader) |
|
|
|
for { |
|
|
|
line, error := r.ReadString('\n') |
|
|
|
if error == io.EOF { |
|
|
|
log.Info("read file completed.") |
|
|
|
break |
|
|
|
} |
|
|
|
if error != nil { |
|
|
|
log.Info("read file error." + error.Error()) |
|
|
|
break |
|
|
|
} |
|
|
|
jsonContent += line |
|
|
|
} |
|
|
|
} |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
if jsonContent != "" { |
|
|
|
serialNo, err := aisafety.CreateSafetyTask(req, jsonContent) |
|
|
|
if err == nil { |
|
|
|
//update serial no to db |
|
|
|
job.PreVersionName = serialNo |
|
|
|
err = models.UpdateJob(job) |
|
|
|
if err != nil { |
|
|
|
log.Error("UpdateJob failed:", err) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
log.Info("The json is null. so set it failed.") |
|
|
|
//update task failed. |
|
|
|
job.Status = string(models.JobFailed) |
|
|
|
err = models.UpdateJob(job) |
|
|
|
if err != nil { |
|
|
|
log.Error("UpdateJob failed:", err) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func isTaskNotFinished(status string) bool { |
|
|
|
if status == string(models.ModelArtsTrainJobRunning) || status == string(models.ModelArtsTrainJobWaiting) { |
|
|
|
return false |
|
|
|
return true |
|
|
|
} |
|
|
|
if status == string(models.JobWaiting) || status == string(models.JobRunning) { |
|
|
|
return false |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
if status == string(models.ModelArtsTrainJobUnknown) || status == string(models.ModelArtsTrainJobInit) { |
|
|
|
return false |
|
|
|
return true |
|
|
|
} |
|
|
|
if status == string(models.ModelArtsTrainJobImageCreating) || status == string(models.ModelArtsTrainJobSubmitTrying) { |
|
|
|
return false |
|
|
|
return true |
|
|
|
} |
|
|
|
return true |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
func StopAiSafetyTask(ctx *context.Context) { |
|
|
@@ -95,7 +215,16 @@ func DelAiSafetyTask(ctx *context.Context) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
func CloudBrainAiSafetyCreate(ctx *context.Context) { |
|
|
|
func AiSafetyCreateForGet(ctx *context.Context) { |
|
|
|
ctx.Data["PageIsCloudBrain"] = true |
|
|
|
ctx.Data["BaseDataSetName"] = setting.ModelSafetyTest.BaseDataSetName |
|
|
|
ctx.Data["BaseDataSetUUID"] = setting.ModelSafetyTest.BaseDataSetUUID |
|
|
|
ctx.Data["CombatDataSetName"] = setting.ModelSafetyTest.CombatDataSetName |
|
|
|
ctx.Data["CombatDataSetUUID"] = setting.ModelSafetyTest.CombatDataSetUUID |
|
|
|
ctx.HTML(200, tplModelSafetyTestCreate) |
|
|
|
} |
|
|
|
|
|
|
|
func AiSafetyCreateForPost(ctx *context.Context) { |
|
|
|
ctx.Data["PageIsCloudBrain"] = true |
|
|
|
displayJobName := ctx.Query("DisplayJobName") |
|
|
|
jobName := util.ConvertDisplayJobNameToJobName(displayJobName) |
|
|
|