最近因为项目需要将rasa nlu配置到docker容器中供系统调用,本篇主要整理该服务的docker配置过程。
本篇的重点在于docker的使用,不在Rasa NLU。
系统环境:Ubuntu 18.04.6
1. Rasa介绍
Rasa是一个开源的机器学习框架,专为构建基于文本和语音的对话驱动型自动化智能客服助手而设计。它能够克服传统客服的部分缺陷,提供自然语言理解(Rasa NLU)和对话管理(Rasa Core)两大核心功能。Rasa NLU负责用户意图识别、实体提取等,而Rasa Core则基于对话历史和用户输入,预测并决定下一步的对话动作。Rasa支持多种语言,包括英语和汉语,且易于集成到其他应用或系统中,如网站、软件和机器人等。其轻量级、高性能的设计以及多模型支持的特性,使得开发者能够快速构建各类智能对话应用。
2. 具体过程
2.1 拉取镜像
在开始之前,需要将rasa
镜像拉取到Ubuntu系统中。最近国内很多docker镜像库接连失效,考虑使用代理拉取rasa
镜像。但笔者的Ubuntu系统是安装在虚拟机中,无法使用代理。基于以上种种原因,本篇先在宿主机上拉取rasa
镜像,然后将宿主机作为私人仓库供虚拟机拉取镜像。具体步骤如下:
- 确保宿主机系统和虚拟机中的Ubuntu系统都已经安装docker。
- 先在宿主机系统(即安装虚拟机的系统)上拉取
rasa
镜像(rasa
的镜像地址可以在docker hub中自行查找)。其具体代码如下:
docker pull rasa/rasa:3.6.20-full
如果在Ubuntu系统上直接通过docker pull拉取rasa镜像能够成功的话,就不需要执行后续步骤了
- 在宿主机系统上创建docker私人仓库,并将刚刚拉取的
rasa
镜像推送到私人仓库中,其具体代码如下:
docker pull registry
#创建私人仓库对应的docker容器,一般宿主机选择5000端口,即设置-p 5000:5000,但笔者的宿主机系统上的5000端口已经被占用,所以改成9000端口(端口号可以依据宿主机的情况来设定)
docker run -d --name registry -p 9000:5000 registry
#给rasa镜像打标签
docker tag rasa/rasa:3.6.20-full localhost:9000/rasa
#将镜像推送到私人仓库中
docker push localhost:9000/rasa
- 使用
ifconfig
命令获取宿主机系统的ip地址(步骤省略)。虚拟机中的Ubuntu系统可以通过宿主机系统ip:9000
访问宿主机上的私人仓库。 - 修改虚拟机中Ubuntu系统中的docker文件
daemon.json
,并重启docker服务。具体操作如下:
sudo vim /etc/docker/daemon.json
将如下内容添加到daemon.json
文件中:
"insecure-registries":["宿主机系统ip:9000"]
#宿主机ip地址不需要添加http://或https://前缀
接着,重启docker服务,具体如下:
systemctl daemon-reload
sytemctl restart docker.service
- 虚拟机系统通过以下命令即可从宿主机上的docker私人仓库上拉取
rasa
镜像:
docker login 宿主机ip:9000 #需要输入账号和密码,可以随意设置,与宿主机的账号密码无关
#领取rasa镜像
docker pull 宿主机系统ip:9000/rasa
#查看镜像
docker images
2.2 创建容器
从此处开始,以下过程都是在虚拟机中的Ubuntu系统上进行。rasa
镜像拉取成功之后,需要使用如下命令创建容器:
docker run -d --name rasa -p 9000:5005 宿主机ip:9000/rasa run --enable-api
关于这行命令及其使用的参数,说明如下:
-d
:表示容器在后台运行;-name
:指定容器名称;-p
:映射或公开容器的端口到宿主机(这里的宿主机指的是docker容器宿主机,即Ubuntu系统)的端口。在这个案例中即通过Ubuntu系统的9000端口(这个端口号与私人docker仓库的的端口号没有任何关系,这里只是恰好相同)即可访问该docker容器的5005端口,而5005端口为Rasa NLU默认的运行端口。run --enable-api
: 为修改的容器启动命令。docker镜像的ENTRYPOINT
指令规定了Docker容器启动时运行的默认可执行文件或命令,而CMD
规定了容器启动时的默认参数,rasa
镜像中默认的ENTRYPOINT
和CMD
可以docker hub中查到,其具体如下。
但笔者希望该容器能以RESTful HTTP API的形式提供Rasa NLU服务,所以需要修改CMD
为run --enable-api
(要更改CMD
, 只需将覆盖的命令和参数添加到docker run
命令的最后即可)。
上述命令运行成功之后,即可通过docker ps -a
命令看到成功创建的容器。
2.3 部署Rasa NLU
容器创建完成之后,接着就需要与容器进行交互了并创建Rasa NLU服务了。其指令如下:
docker exec -it -u 0 rasa bash
关于这个命令有以下几点需要说明:
-it
:为用户提供了一个完整的交互式终端环境,让用户能够像在本地计算机上一样与容器进行交互。-u 0
:以root用户的身份在容器中执行指定的命令。如果在容器中执行指令的时候,如果遇到权限问题,就需要加上这个。bash
: 启动一个新的bash shell会话。
成功执行上述命令之后,即可看到如下结果:
接着便可以在该容器中创建Rasa NLU服务了(先执行rasa init
命令之后即可开始训练模型,具体的过程这里省略)。
如果在创建服务的过程中需要向docker容器中传输文件,可以使用docker cp
命令。假设需要将Ubuntu系统中的/tmp/nlu.yml
传输到rasa
容器中的/app/data
中时,可以使用如下命令:
#执行该命令时,需要先使用`exit`命令退出docker容器的bash shell会话,回到Ubuntu系统中
docker cp /tmp/nlu.yml rasa:/app/data
若需要将容器中的文件传输到Ubuntu系统中,则将上述两类路径的位置调换即可。
2.4 重启容器并使用服务
等到训练完Rasa NLU的模型之后,需要重启容器保证所做的修改生效。具体指令如下:
docker restart rasa
接着便可以使用该服务了,这里仅举一个例子,具体如下:
curl localhost:9000/model/parse -d '{"text":"hello"}'
其执行结果如下:
还有一点要注意,在重启完docker容器之后不要立即就执行上述命令。因为重启容器其实是执行rasa run --enable-api
命令,这个命令的执行需要一点时间。如果立即执行了curl
命令调用Rasa NLU服务,可能会报错。
参考资料
- https://blog.csdn.net/qq_41056224/article/details/120343764