在线服务

训练后的模型可以用于接收输入并进行推理(图像分类)。本例中模型接收图片作为输入,并返回图片上识别出的物体类别为结果。

我们使用Docker进行代码和模型的封装,你可以下载本文提供的镜像,也可以自己生成镜像。

下载镜像

你可以跳过下面的“自己生成镜像”步骤。

下载镜像:

sudo docker pull uhub.service.ucloud.cn/uai_demo/cifar_infer_simple:latest

你需要将该镜像重新docker tag成你自己uhub镜像库中的镜像,例如uhub.ucloud.cn//cifar_infer_simple:latest

自己生成镜像

文件准备

我们使用Docker进行代码和模型的封装,需要准备如下数据文件:

|_ code/

|_ inference/
   |_ cifar_inference.py 
   |_ checkpoint_dir/
|_ cifar.conf
|_ cifar_infer.Dockerfile

其中checkpoint_dir保存了模型训练中得到模型文件。

cifar.conf介绍

{                                                                               
	"http_server" : {                                                                                              
		"exec" : {                                                                                  
			"main_class": "cifarModel",                                                                            
			"main_file": "cifar_infer"                                                                           
		},                                                                                                 
		"tensorflow" : {                                                                                        
			"model_dir" : "./checkpoint_dir"                                                                       
		}                                                                                           
	}                                                                                                       
} 
  • 其中exec.main_file定义了入口python模块:cifar_infer.py(注:这边需要将.py 删除,因为django会以模块的形式import cifar_inference)
  • 其中exec.main_class定义了推理服务的对象类:cifarModel
    • 其中tensorflow.model_dir定义了模型的相对路径

    #### cifar_infer.Dockerfile介绍 FROM uhub.service.ucloud.cn/uaishare/cpuuaiserviceubuntu-14.04python-2.7.6tensorflow-1.4.0:v1.2 EXPOSE 8080

ADD ./inference/ /ai-ucloud-client-django/ ADD ./code/ /ai-ucloud-client-django/ ADD ./cifar.conf /ai-ucloud-client-django/conf.json ENV UAISERVICECONFIG /ai-ucloud-client-django/conf.json CMD cd /ai-ucloud-client-django && gunicorn -c gunicorn.conf.py httpserver.wsgi

  • 其中定义了使用的基础镜像uhub.service.ucloud.cn/uaishare/cpu_uaiservice_ubuntu-14.04_python-2.7.6_tensorflow-1.4.0:v1.2
  • export 8080端口
  • 将当前目录下code/下的文件复制到/ai-ucloud-client-django/
  • 将cifar.conf 放入/ai-ucloud-client-django/conf.json
  • 指定UAI Inference server在启动时使用/ai-ucloud-client-django/conf.json 配置文件
  • 启动http server

cifar_inference.py介绍

cifar_inference.py首先需要实现一个在线服务的类,该类继承了TFAiUcloudModel(TensorFlow 在线服务基类). cifar_inference.py实现了load_model和execute两个函数。

1. load_model(self):

该函数加载了训练好的cnn模型。

def load_model(self):
   sess = tf.Session()
   x = tf.placeholder(dtype=tf.float32, shape=[1, 24, 24, 3], name='input')
   #inferece
   pred = tf.argmax(cifar10.inference(x),axis=1)
   #load model
   saver = tf.train.Saver()
   params_file = tf.train.latest_checkpoint(self.model_dir)
   saver.restore(sess=sess, save_path=params_file)
   #Register ops into self.output dict.So func execute() can get these ops
   self.output['sess'] = sess
   self.output['x'] = x
   self.output['y_'] = pred

2. execute(self, data, batch_size) :

该函数从data获取batching的请求数据,并转化为numpy list;通过sess.run请求推理操作;将请求结果合并成ret(ret也是一个list,和data list是一一对应的关系)

def execute(self, data, batch_size):

sess = self.output['sess']
   x = self.output['x']
   y_ = self.output['y_']
   ret = []
   for i in range(batch_size):
​	'''
​	1 load data 
​	'''
​	image = Image.open(data[i])
​	image = cv2.cvtColor(np.asarray(image),cv2.COLOR_RGB2BGR)
​	image = cv2.resize(image, (24, 24))
​	mean=np.mean(image)
​	std=np.std(image)
​	image=(image-mean)/max(std,1/np.sqrt(image.size))
​	image = np.expand_dims(image, axis=0).astype(np.float32)
​	'''
​	2 inference
​	'''
​	preds = sess.run(y_, feed_dict={x: image})
​	pred_label=label_dict[preds[0]]
​	ret.append(pred_label)
   return ret

生成镜像

准备好以上文件之后,我们可以通过cifar_infer.Dockerfile生成Docker镜像。

sudo docker build -t uhub.service.ucloud.cn//cifar_infer_simple:latest -f cifar_infer.Dockerfile .

本地测试

得到镜像之后,我们可以在本地进行测试。

sudo docker run -it -p 8080:8080 

uhub.service.ucloud.cn//cifar_infer_simple:latest

我们在./test_images/放置了用于测试的图像,进入放置了测试图像的文件夹:

curl -X POST http://localhost:8080/service -T deer.png

命令行输出该图像中的物体类别deer,则测试成功。

UAI-Inference平台测试

可以在部署CPU在线服务APP上查看部署在线服务的具体操作步骤。 当部署完毕之后,我们可以在详细页面获取CNN在线服务的URL地址。

进入放置了测试图像的文件夹,我们可以通过如下命令来测试,这里的URL即为这个在线服务的URL地址:

curl -X POST http:///service -T deer.png

命令行输出该图像中的物体类别deer,则测试成功。