采用server方式推理一个模型,会崩溃。
采用pipeline方式推理一个模型,不会崩溃。
不管是server还是pipeline,都调用了同样的generate()方法,但是为什么会产生不同的结果?传递的参数不同。
比如server调用的位置如下:
断点对比了generate()方法中的gen_config参数,
发现server中默认do_sapmle=True。pipelie中do_sample=False。
do_sample=True时,会崩溃。do_sample会影响top_k、top_p、temperature参数。 代码如下:
如果do_sample=False, 采用的greedy 贪婪搜索(主要是top_k = 1),不会崩溃。 do_sample=True时,采用的是采样方法(top_k > 1),比如top_k = 40, 会崩溃。
由于是使用的pytorch的eager模式,采用dlinfer调用的Ascend npu推理。跟踪到了下面的算子multinomial_sampling崩溃了。
根据不同的backend,比如Ascend npu、GPU等,multinomial_sampling的实现不同。
搜索OpType.MultinomialSampling,可以找到default实现。
Python | |
---|---|
写个例子测试下: 参考https://github.com/Ascend/pytorch
Python | |
---|---|
另一种修改方式是,判断前面如果是inf,就不能做softmax。
或者将inf换成一个比较大的数,比如1e5。
Python | |
---|---|
example:
参数支持top_k设置¶
可以看到 api不支持top_k的设置,需要修改源代码。
从上面的代码分析,可以知道do_sample = False, 就是采用greedy策略采样。等价于设置下面的参数:
Text Only | |
---|---|
completions_v1 接口目前支持top_k的设置,但是和chat_completions_v1还是有区别的。直接替换调用,并不能成功。 + 参数messages需要替换成prompt
还有一种改法,将temperature设置为一个非0值,temperature设置为0时,下面的temperature=1e-6,所以scores会变成无穷大。
Python | |
---|---|