A-Tune/common/tuning/optimizer.go
Zhipeng Xie 4335408875 atune: init code
upload code to gitee

Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
2019-11-13 17:14:15 +08:00

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
}