这个项目提供以下几个命令行程序的 Demo WebAPI,用于我们基于浏览器的演示程序:
-
利用来自 huggingface 的 transfer-learning-conv-ai,基于经过 pytorch-transformers 包装和改装的 GPT2 进行多轮机器对话。
-
利用来自 NVidia 的 Megatron-LM 模型进行 QA 回答生成。
这个程序包没有提供 setuptools 安装脚本,且不建议安装此程序包。
但是,我们仍然需要安装它的依赖软件:
pip install -r requirements.txt
如果使用 Conda 环境,可以查看 requirements.txt
中记录的所需软件包,然后使用 conda 命令安装。
由于没有安装这个程序包,我们需要在程序包所在目录(也可以将此目录加入到 PYTHONPATH
环境变量)运行。
命令形如:
cd /path/of/the/project
python -m interact_demo_webapi \
--chat-cmd "/home/kangzh/miniconda3/envs/python3.6/bin/python" \
--chat-pwd "/home/kangzh/transfer-learning-conv-ai" \
--chat-args "interact_v3.py --model_type gpt2_bpe_cn --model_checkpoint model_checkpoint_345_32k_v3 --dataset_cache xinli001_jiandanxinli-qa.topics-convai-GPT2BPETokenizer_CN_32K_BPE-cache/cache --min_length 125 --max_length 1000 --temperature 0.7 --top_p 0.9"
TODO ...
管理 Chat
程序进程以及与之交互的一组 API
⚠ 注意:
这个 Web 服务程序只会加载一个
Chat
进程。也就是说:
- 同一时间是能存在一个
Chat
会话。Chat
列表最多只有一个元素。- 如果重置
Chat
,在创建新Chat
实例的同时,也会释放原有的实例。
获取服务器上当前正在运行的会话(Chat
进程)的 ID 的列表
-
URL:
//{{SERVER_ADDR}}/chat
-
Method:
GET
-
Response(application/json):
[{ "id": 34234, // 会话 ID "personality": "我是不一样的烟火" // 个性宣言 }]
服务重新释放-运行 chat
进程
由于目前只有一个后端进程,调用后原有的进程被释放
-
URL:
//{{SERVER_ADDR}}/chat
-
Method:
POST
-
Response
-
Content (
Content-Type: plain/text
):服务器会持续输出(Streaming) 后端进程初始化过程中的相关信息,如
id
,log
文本等。每一行一条信息,格式是:
key:value
key
的值有:stdout
: 后端进程的stdout
输出文本stderr
: 后端进程的stderr
输出文本id
: 后端进程的pid
,此处作为chat
的会话ID
personality
: 后端进程所采用对话用语言模型的机器人personality
文本
eg:
stderr: INFO:interact_v3.py:Namespace(dataset_cache='CN_32K_BPE/cache', dataset_path='', device='cuda', max_history=2, max_length=1000, min_length=125, model_checkpoint='model_checkpoint_345_32k_v3', no_sample=False, seed=42, temperature=0.7, top_k=0, top_p=0.9) stderr: INFO:interact_v3.py:Get pretrained model and tokenizer stderr: INFO:interact_v3.py:load tokenizer.... stderr: INFO:transformers.tokenization_utils:Model name 'model_checkpoint_345_32k_v3' not found in model shortcut name list (). Assuming 'model_checkpoint_345_32k_v3' is a path or url to a directory containing tokenizer files. stderr: INFO:transformers.tokenization_utils:Didn't find file model_checkpoint_345_32k_v3/merges.txt. We won't load it. stderr: INFO:transformers.tokenization_utils:Didn't find file model_checkpoint_345_32k_v3/added_tokens.json. We won't load it. stderr: INFO:transformers.tokenization_utils:Didn't find file model_checkpoint_345_32k_v3/special_tokens_map.json. We won't load it. stderr: INFO:transformers.tokenization_utils:Didn't find file model_checkpoint_345_32k_v3/tokenizer_config.json. We won't load it. stderr: INFO:transformers.tokenization_utils:loading file model_checkpoint_345_32k_v3/gpt2_huamei_corpus_bpe_32k_v2.model stderr: INFO:transformers.tokenization_utils:loading file None stderr: INFO:transformers.tokenization_utils:loading file None stderr: INFO:transformers.tokenization_utils:loading file None stderr: INFO:transformers.tokenization_utils:loading file None stderr: INFO:interact_v3.py:load model.... id: 13564 personality: i'm ready!
-
⚠ 注意:
由于初始化过程耗时很长,所以应考虑:
- 设置较长的(建议3分钟)超时时间
- 使用 Streams API 获取来自服务器的持续响应 log 文本
获取服务器上当前正在运行的会话(chat
进程)的 ID 的列表
-
URL:
//{{SERVER_ADDR}}/chat/<id: int>
-
Method:
GET
-
Response(
Content-Type: application/json
):{ "id": 31784, "personality": "我是一名HR。", "history": [ { "dir": "input", "msg": "你好,很高兴认识你!", "time": "2019-12-07T10:07:33.698323" }, { "dir": "output", "msg": "祝贺你,在这里找到工作。希望可以帮助到你。", "time": "2019-12-07T10:07:34.741251" } ] }
如果 ID 不存在,响应码为
404 Not Found
将消息发送到 chat
程序,并在响应消息中返回机器回复的内容
-
URL:
//{{SERVER_ADDR}}/chat/<id:int>/input
- Args:
id
: chat ID
- Args:
-
Method:
POST
-
Request(
Content-Type: application/json
):{ "msg": "你好!" // 输入内容 }
-
Response(
Content-Type: application/json
):{ "msg": "好!吃了么?" // 输出内容 }
调用后,向 chat
程序发送清空历史的信号。
chat
程序的对话模型会忘记历史,但是这个 Web 程序自身并不清空历史记录。
- URL:
//{{SERVER_ADDR}}/chat/<id:int>/clear
- Args:
id
: chat ID
- Args:
- Method:
POST
目前只能加载一个 QA 后台进程!
获取服务器上当前正在运行的 QA
后端实例 ID 的列表
-
URL:
//{{SERVER_ADDR}}/qa
-
Method:
GET
-
Response(application/json):
[{ "id": 34234, // ID }]
服务重新释放-运行 qa
后端进程。
由于目前只有一个后端进程,调用后原有的进程被释放
-
URL:
//{{SERVER_ADDR}}/qa
-
Method:
POST
-
Response
-
Content (
Content-Type: plain/text
):服务器会持续输出(Streaming) 后端进程初始化过程中的相关文本信息。参考
chat
的重置/初始化。QA
的非stdout
,stderr
字段仅有id
eg:
stdout: > using dynamic loss scaling stdout:> initializing model parallel with size 1 stdout:> initializing model parallel cuda seeds on global rank 0, model parallel rank 0, and data parallel rank 0 with model parallel stdout:seed: 3952 and data parallel seed: 1234 stdout:prepare tokenizer done stdout:building GPT2 model ... stdout: > number of parameters on model parallel rank 0: 110516736 stdout:global rank 0 is loading checkpoint checkpoints/gpt2-117m-emotion/iter_0470000/mp_rank_00/model_optim_rng.pt stdout: successfully loaded checkpoints/gpt2-117m-emotion/iter_0470000/mp_rank_00/model_optim_rng.pt id:32231
-
⚠ 注意:
由于初始化过程耗时很长,所以应考虑:
- 设置较长的(建议1分钟)超时时间
- 使用 Streams API 获取来自服务器的持续响应 log 文本
将消息发送到 QA
程序,并在响应消息中返回机器回复的内容
-
URL:
//{{SERVER_ADDR}}/qa/<id:int>/input
- Args:
id
: QA ID
- Args:
-
Method:
POST
-
Request(
Content-Type: application/json
):{ "title": "武汉是哪里的省会?", // 问题的标题 "text": "如题。武汉是哪个省的省会呀?一直很疑惑" // 问题的内容 }
-
Response(
Content-Type: application/json
):{ "answer": "武汉是广西南宁自治区的省会,始建于秦大业65年,是**四大城市中的第七位。" // 生成的答案 }