188 lines
4.1 KiB
Go
188 lines
4.1 KiB
Go
/*
|
|
* Copyright (c) 2019 Huawei Technologies Co., Ltd.
|
|
* A-Tune is licensed under the Mulan PSL v1.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v1.
|
|
* You may obtain a copy of Mulan PSL v1 at:
|
|
* http://license.coscl.org.cn/MulanPSL
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
|
* PURPOSE.
|
|
* See the Mulan PSL v1 for more details.
|
|
* Create: 2019-10-29
|
|
*/
|
|
|
|
package tuning
|
|
|
|
import (
|
|
PB "atune/api/profile"
|
|
"atune/common/config"
|
|
"atune/common/http"
|
|
"atune/common/log"
|
|
"atune/common/project"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
)
|
|
|
|
type optimizerBody struct {
|
|
MaxEval int `json:"max_eval"`
|
|
Knobs []knob `json:"knobs"`
|
|
}
|
|
|
|
type knob struct {
|
|
Dtype string `json:"dtype"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
Range []int64 `json:"range"`
|
|
Items []int64 `json:"items"`
|
|
Step int64 `json:"step"`
|
|
Ref string `json:"ref"`
|
|
}
|
|
|
|
type respPostBody struct {
|
|
TaskID string `json:task_id`
|
|
}
|
|
|
|
type optimizerPutBody struct {
|
|
Iterations int `json:"iterations"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
type respPutBody struct {
|
|
Param string `json:"param"`
|
|
}
|
|
|
|
func (o *optimizerBody) Post() (*respPostBody, error) {
|
|
url := config.GetUrl(config.OptimizerURI)
|
|
res, err := http.Post(url, o)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer res.Body.Close()
|
|
|
|
respBody, err := ioutil.ReadAll(res.Body)
|
|
respPostIns := new(respPostBody)
|
|
|
|
err = json.Unmarshal(respBody, respPostIns)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return respPostIns, nil
|
|
}
|
|
|
|
func (o *optimizerPutBody) Put(url string) (*respPutBody, error) {
|
|
res, err := http.Put(url, o)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer res.Body.Close()
|
|
|
|
respBody, err := ioutil.ReadAll(res.Body)
|
|
respPutIns := new(respPutBody)
|
|
|
|
err = json.Unmarshal(respBody, respPutIns)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return respPutIns, nil
|
|
|
|
}
|
|
|
|
// Optimizer : the type implement the bayes serch service
|
|
type Optimizer struct {
|
|
Prj *project.YamlPrj
|
|
}
|
|
|
|
/*
|
|
DynamicTuned method using bayes algorithm to search the best performance parameters
|
|
*/
|
|
func (o *Optimizer) DynamicTuned(ch chan *PB.AckCheck) error {
|
|
//dynamic profle setting
|
|
iterations := o.Prj.Iterations
|
|
optimizerBody := new(optimizerBody)
|
|
optimizerBody.MaxEval = iterations
|
|
|
|
optimizerBody.Knobs = make([]knob, 0)
|
|
|
|
for _, item := range o.Prj.Object {
|
|
knob := new(knob)
|
|
knob.Dtype = item.Info.Dtype
|
|
knob.Name = item.Name
|
|
knob.Type = item.Info.Type
|
|
knob.Ref = item.Info.Ref
|
|
knob.Range = item.Info.Scope
|
|
knob.Items = item.Info.Items
|
|
knob.Step = item.Info.Step
|
|
optimizerBody.Knobs = append(optimizerBody.Knobs, *knob)
|
|
}
|
|
|
|
respPostIns, err := optimizerBody.Post()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Infof("create task id is %s", respPostIns.TaskID)
|
|
url := config.GetUrl(config.OptimizerURI)
|
|
optimizerPutURL := fmt.Sprintf("%s/%s", url, respPostIns.TaskID)
|
|
|
|
log.Infof("optimizer put url is: %s", optimizerPutURL)
|
|
|
|
var eval string
|
|
for i := 0; i <= iterations+1; i++ {
|
|
optPutBody := new(optimizerPutBody)
|
|
optPutBody.Iterations = i
|
|
optPutBody.Value = eval
|
|
|
|
respPutIns, err := optPutBody.Put(optimizerPutURL)
|
|
if err != nil {
|
|
log.Errorf("get setting parameter error: %v", err)
|
|
return err
|
|
}
|
|
if i == iterations {
|
|
ch <- &PB.AckCheck{Name: fmt.Sprintf("Optimized result is: %s", respPutIns.Param)}
|
|
break
|
|
}
|
|
|
|
log.Infof("setting params is: %s", respPutIns.Param)
|
|
if err := o.Prj.RunSet(respPutIns.Param); err != nil {
|
|
log.Error(err)
|
|
return err
|
|
}
|
|
|
|
log.Info("set the parameter success")
|
|
if err := o.Prj.RestartProject(); err != nil {
|
|
log.Error(err)
|
|
return err
|
|
}
|
|
log.Info("restart project success")
|
|
|
|
benchmarkByte, err := o.Prj.BenchMark()
|
|
if err != nil {
|
|
log.Error(err)
|
|
return err
|
|
}
|
|
|
|
eval, err = o.Prj.Evaluation(benchmarkByte)
|
|
if err != nil {
|
|
log.Error(err)
|
|
return err
|
|
}
|
|
|
|
log.Info(eval)
|
|
}
|
|
|
|
resp, err := http.Delete(optimizerPutURL)
|
|
if err != nil {
|
|
log.Info("delete task faild:", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
resBytes, err := ioutil.ReadAll(resp.Body)
|
|
log.Debug(string(resBytes))
|
|
return nil
|
|
}
|