diff --git a/doc/IMDB_GO_CLIENT.md b/doc/IMDB_GO_CLIENT.md new file mode 100644 index 0000000000000000000000000000000000000000..f39b3dd1ba980e0d04df3e8a673026b53ca0fd56 --- /dev/null +++ b/doc/IMDB_GO_CLIENT.md @@ -0,0 +1,193 @@ +# How to use Go Client of Paddle Serving + +This document shows how to use Go as your client language. For Go client in Paddle Serving, a simple client package is provided https://github.com/PaddlePaddle/Serving/tree/develop/go/serving_client, a user can import this package as needed. Here is a simple example of sentiment analysis task based on IMDB dataset. + +### Install + +We suppose you have 1.9.2 or later version installed and python 2.7 version installed + +```shell +go get github.com/PaddlePaddle/Serving/go/serving_client +go get github.com/PaddlePaddle/Serving/go/proto +pip install paddle-serving-server +``` + +### Download Text Classification Model + +``` shell +wget https://paddle-serving.bj.bcebos.com/data%2Ftext_classification%2Fimdb_serving_example.tar.gz +tar -xzf imdb_serving_example.tar.gz +``` + +### Server Side Code + +```python +# test_server_go.py +import os +import sys +from paddle_serving_server import OpMaker +from paddle_serving_server import OpSeqMaker +from paddle_serving_server import Server + +op_maker = OpMaker() +read_op = op_maker.create('general_text_reader') +general_infer_op = op_maker.create('general_text_infer') + +op_seq_maker = OpSeqMaker() +op_seq_maker.add_op(read_op) +op_seq_maker.add_op(general_infer_op) + +server = Server() +server.set_op_sequence(op_seq_maker.get_op_sequence()) +server.load_model_config(sys.argv[1]) +server.prepare_server(workdir="work_dir1", port=9292, device="cpu") +server.run_server() +``` + +### Start Server + +``` shell +python test_server_go.py ./serving_server_model/ 9292 +``` + +### Client code example + +``` go +// imdb_client.go +package main + +import ( + "io" + "fmt" + "strings" + "bufio" + "strconv" + "os" + "serving_client" +) + +func main() { + var config_file_path string + config_file_path = os.Args[1] + handle := serving_client.LoadModelConfig(config_file_path) + handle = serving_client.Connect("127.0.0.1", "9292", handle) + + test_file_path := os.Args[2] + fi, err := os.Open(test_file_path) + if err != nil { + fmt.Print(err) + } + + defer fi.Close() + br := bufio.NewReader(fi) + + fetch := []string{"cost", "acc", "prediction"} + + var result map[string][]float32 + + for { + line, err := br.ReadString('\n') + if err == io.EOF { + break + } + + line = strings.Trim(line, "\n") + + var words = []int64{} + + s := strings.Split(line, " ") + value, err := strconv.Atoi(s[0]) + var feed_int_map map[string][]int64 + + for _, v := range s[1:value + 1] { + int_v, _ := strconv.Atoi(v) + words = append(words, int64(int_v)) + } + + label, err := strconv.Atoi(s[len(s)-1]) + + if err != nil { + panic(err) + } + + feed_int_map = map[string][]int64{} + feed_int_map["words"] = words + feed_int_map["label"] = []int64{int64(label)} + + result = serving_client.Predict(handle, feed_int_map, fetch) + fmt.Println(result["prediction"][1], "\t", int64(label)) + } +} +``` + +### Prediction based on IMDB Test set + +``` python +go run imdb_client.go serving_client_conf/serving_client_conf.stream.prototxt test.data > result +``` + + + +### Compute accuracy + +```python +// acc.go +package main + +import ( + "io" + "os" + "fmt" + "bufio" + "strings" + "strconv" +) + +func main() { + score_file := os.Args[1] + fi, err := os.Open(score_file) + if err != nil { + fmt.Print(err) + } + + defer fi.Close() + br := bufio.NewReader(fi) + + total := int(0) + acc := int(0) + for { + line, err := br.ReadString('\n') + if err == io.EOF { + break + } + + line = strings.Trim(line, "\n") + s := strings.Split(line, "\t") + prob_str := strings.Trim(s[0], " ") + label_str := strings.Trim(s[1], " ") + prob, err := strconv.ParseFloat(prob_str, 32) + if err != nil { + panic(err) + } + label, err := strconv.ParseFloat(label_str, 32) + if err != nil { + panic(err) + } + if (prob - 0.5) * (label - 0.5) > 0 { + acc++ + } + total++ + } + fmt.Println("total num: ", total) + fmt.Println("acc num: ", acc) + fmt.Println("acc: ", float32(acc) / float32(total)) + +} +``` + +``` +go acc.go result +``` + + +