[THUDM/ChatGLM-6B][Help] 生成的停止条件是什么

2024-05-21 996 views
8
Environment
- OS:
- Python:
- Transformers:
- PyTorch:
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :

linux

请问一下,chat或者stream_chat中调用的generate函数是如何判断要停止生成的呢?看了一下源码好像是没有特殊的限制的话,只会到达max_length或者max_time的时候才会停止。是通过什么其他的标准,比如eos或者换行符来判断的吗?

回答

5

就是训练的素材,构造inputs 时 后面接一个eop,但我看到有人在最后接的是 eos ,,没太懂。。

0

你好@chenyiwan ,感谢回复

想请教一下,在推理的代码中,有比如说判断是eos然后停止生成的地方吗?好像没看到有相关的代码哎

4

有个野路子,使用 stream_chat 回答,丢线程或者异步里做,然后额外暴露一个 api 用来做停止,触发 api 后把 stream_chat 的线程或者异步任务干掉就行了,因为在此线程或者异步内,向 model 的调用是同步的,线程或者异步任务退出,model 的调用停止,也就不消耗计算资源了,大体逻辑如下

流式回答: user -> request(chat_glm_request)-> [ REST API ] stream_chat -> response(chat_glm_response, chat_id) 终止回答 user -> request(chat_id) -> [ REST API ] stream_chat_operation -> response(empty)

3

@ZXiangQAQ 感谢回复,这种手动停止的方法应该是可行的。但是我现在比较好奇,目前现有的chat函数,或者说内部调用的generate函数到底是如何判断停止生成的,不知道您是否清楚内部的逻辑

1

@ZXiangQAQ 感谢回复,这种手动停止的方法应该是可行的。但是我现在比较好奇,目前现有的chat函数,或者说内部调用的generate函数到底是如何判断停止生成的,不知道您是否清楚内部的逻辑

看源码用的是 Transformer 的 AutoModel,停止应该是通过指定生成的最大长度或停止条件,2楼其实已经提到了 max_length 传递最大长度 eos_token_id 传递停止标记,只要生成的回答中出现了这个标记,就可以停止生成

4

@ZXiangQAQ 确实,trace了一下源码的执行流程,大多数情况下都是判断到eos然后就停止了