你好,
我是一个MII的新探索者。
当我尝试进行批量推理时,遇到了这样的问题:
start_text = ["blablabla..."]
batch_size = 10
result = generator.query({"query": start_text * batch_size})
看起来它正在进行顺序推理,时间会随着批次大小的增加而累积。所以我这样做了:
start_text = ["blablabla..."]
batch_size = 10
result = generator.query({"query": start_text * batch_size}, batch_size=batch_size)
我得到了这个错误:
Pipeline with tokenizer without pad_token cannot do batching. You can try to set it with `pipe.tokenizer.pad_token_id = model.config.eos_token_id`."
我认为我离正确答案很近,因为我知道这个错误似乎是来自Huggingface管道和deepspeed.init_inference()。我可以这样设置,但我不知道MII如何设置,因为一切都被封装起来了。
谢谢!
7条答案
按热度按时间zengzsys1#
你好,Emerald01,感谢你报告这个问题。你能提供更多的细节吗?比如你使用的是哪个模型和任务?
pkbketx92#
你好,@mrwyattii ,感谢你的帮助。
我们正在尝试了解如何使用DeepSpeed MII以更低的成本和更高的效率托管模型。我们正在测试CodeGen(尽管它不是MII直接支持的,但通过跳过模型检查,它可以运行得非常好,正如另一个问题中讨论的那样),但我们还将测试其他更大的模型。
如果我们不进行批处理推理,它运行得非常好。但是当我有一个像这个例子中的提示列表这样的批量输入时,输出延迟与批量大小成线性关系,因此我想知道是否有办法进行批处理推理,然后我使用了
batch_size=
,看起来是正确的,但我得到了上面的错误。在原始的DeepSpeed + pipeline中,我可以很容易地纠正这个问题,就像设置pipe.tokenizer.pad_token_id = pipe.model.config.eos_token_id
一样,但由于MII封装了一切,我不知道我应该如何与你的API互动,使分词器对批处理感到满意。如果你有任何建议,或者我遗漏了什么,请告诉我。非常感谢!
3zwtqj6y3#
@Emerald01 我在我的系统上成功复现了这个问题。我们目前在MII API中没有一个方法来实现修复这个分词器填充问题的必要更改。然而,我认为将来这将是有价值的添加。我将不得不与团队讨论如何启用这种功能。
在此期间,您可以通过安装修补版本来解决问题:
git clone https://github.com/microsoft/DeepSpeed-MII.git
cd DeepSpeed-MII
touch tokenizer_padding.patch
tokenizer_padding.patch
并粘贴以下内容:git apply tokenizer_padding.patch
pip install .
请告诉我这是否有效,并期待未来的发展,以便更多地自定义管道对象!
kx1ctssn4#
@mrwyattii
这个方法可行!谢谢。
然而,我注意到每个GPU实际上得到了原始模型的大小,而不是将模型拆分到各个设备上,就像我想象的那样。我想这是一个单独的问题,但我只是想提出来看看我们是否有任何快速的解决方案。如果你认为这是更合适的做法,我可以打开一个新的问题。
这是部分日志,它证实了我开启了2个A100 GPUs
现在它运行得很好。直到......
最后,当我运行batch_size = 32时,它引发了OOM(内存不足)。我看到它使用了大约36G,这就是整个模型的大小。每个A100有40G内存,所以OOM是有道理的。我认为每个设备可能只得到模型的一半左右,大约18G,这样就不会导致内存爆炸。我对DeepSpeed的理解是不是哪里出了问题?
bvuwiixz5#
@Emerald01
您没有看到内存节省的原因是因为DeepSpeed-inference目前不支持Codegen模型的自动内核注入。如果没有DeepSpeed内核,我们不会将模型分片到GPU上。如果您尝试使用支持自动注入的模型(例如,
gpt2
),您会看到每个GPU的内存减少了。对于不支持自动内核注入的模型,我们确实允许自定义注入策略。您可以在我们的单元测试中看到一个示例:https://github.com/microsoft/DeepSpeed/blob/ef6a958e70fe0106afbff9c2c885878cc659f4ac/tests/unit/inference/test_inference.py#L405
此外,您还可以使用ZeRO从GPU内存中卸载。请参阅我们这里的示例:https://github.com/microsoft/DeepSpeed-MII/blob/main/examples/local/text-generation-zero-example.py
a5g8bdjr6#
@mrwyattii I added this line
inference_pipeline.tokenizer.pad_token_id = inference_pipeline.model.config.eos_token_id
after this
DeepSpeed-MII/mii/models/load_models.py
Line 47 in 737c247
| | inference_pipeline=hf_provider(model_path, model_name, task_name, mii_config) |
However, I get
Which points to
I found out "alibi" was on cpu, but irrespective of that.
Here's how error occur:
You can choose any batch size, but once the server has started and a single inference is done with certain batch size, you can't increase the batch size, can keep same or decrease for consecutive batch sizes.
I sometimes also get:
Reproduce:
tjjdgumg7#
嘿,@mrwyattii,你能调查一下这个问题吗?或者指派一个人来处理。