DeepSpeed-MII Int8部署对GPTJ不起作用,

fbcarpbf  于 6个月前  发布在  其他
关注(0)|答案(9)|浏览(85)

尝试使用int8部署GPTJ导致服务器崩溃,并出现以下堆栈跟踪:

╭───────────────────── Traceback (most recent call last) ──────────────────────╮
│ /usr/lib/python3.8/runpy.py:194 in _run_module_as_main                       │
│                                                                              │
│   191 │   main_globals = sys.modules["__main__"].__dict__                    │
│   192 │   if alter_argv:                                                     │
│   193 │   │   sys.argv[0] = mod_spec.origin                                  │
│ ❱ 194 │   return _run_code(code, main_globals, None,                         │
│   195 │   │   │   │   │    "__main__", mod_spec)                             │
│   196                                                                        │
│   197 def run_module(mod_name, init_globals=None,                            │
│                                                                              │
│ /usr/lib/python3.8/runpy.py:87 in _run_code                                  │
│                                                                              │
│    84 │   │   │   │   │      __loader__ = loader,                            │
│    85 │   │   │   │   │      __package__ = pkg_name,                         │
│    86 │   │   │   │   │      __spec__ = mod_spec)                            │
│ ❱  87 │   exec(code, run_globals)                                            │
│    88 │   return run_globals                                                 │
│    89                                                                        │
│    90 def _run_module_code(code, init_globals=None,                          │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/mii/launch/multi_gpu_server.py:70 in  │
│ <module>                                                                     │
│                                                                              │
│   67                                                                         │
│   68 if __name__ == "__main__":                                              │
│   69 │   # python -m mii.launch.multi_gpu_server                             │
│ ❱ 70 │   main()                                                              │
│   71                                                                         │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/mii/launch/multi_gpu_server.py:56 in  │
│ main                                                                         │
│                                                                              │
│   53 │   local_rank = int(os.getenv('LOCAL_RANK', '0'))                      │
│   54 │   port = args.port + local_rank                                       │
│   55 │                                                                       │
│ ❱ 56 │   inference_pipeline = load_models(task_name=args.task_name,          │
│   57 │   │   │   │   │   │   │   │   │    model_name=args.model,             │
│   58 │   │   │   │   │   │   │   │   │    model_path=args.model_path,        │
│   59 │   │   │   │   │   │   │   │   │    ds_optimize=args.ds_optimize,      │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/mii/models/load_models.py:46 in       │
│ load_models                                                                  │
│                                                                              │
│    43 │   │   if "bigscience/bloom" in model_name:                           │
│    44 │   │   │   assert mii_config.dtype == torch.half or mii_config.dtype  │
│    45 │   │   │   assert mii_config.enable_cuda_graph == False, "Bloom model │
│ ❱  46 │   │   inference_pipeline = hf_provider(model_path, model_name, task_ │
│    47 │   elif provider == mii.constants.ModelProvider.ELEUTHER_AI:          │
│    48 │   │   from mii.models.providers.eleutherai import eleutherai_provide │
│    49 │   │   assert mii_config.dtype == torch.half, "gpt-neox only support  │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/mii/models/providers/huggingface.py:1 │
│ 2 in hf_provider                                                             │
│                                                                              │
│    9 │   else:                                                               │
│   10 │   │   local_rank = int(os.getenv('LOCAL_RANK', '0'))                  │
│   11 │   │   device = torch.device(f"cuda:{local_rank}")                     │
│ ❱ 12 │   inference_pipeline = pipeline(                                      │
│   13 │   │   task_name,                                                      │
│   14 │   │   model=model_name,                                               │
│   15 │   │   device=device,                                                  │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/transformers/pipelines/__init__.py:75 │
│ 4 in pipeline                                                                │
│                                                                              │
│   751 │   # Forced if framework already defined, inferred if it's None       │
│   752 │   # Will load the correct model if possible                          │
│   753 │   model_classes = {"tf": targeted_task["tf"], "pt": targeted_task["p │
│ ❱ 754 │   framework, model = infer_framework_load_model(                     │
│   755 │   │   model,                                                         │
│   756 │   │   model_classes=model_classes,                                   │
│   757 │   │   config=config,                                                 │
│                                                                              │
│ /usr/local/lib/python3.8/dist-packages/transformers/pipelines/base.py:266 in │
│ infer_framework_load_model                                                   │
│                                                                              │
│    263 │   │   │   │   continue                                              │
│    264 │   │                                                                 │
│    265 │   │   if isinstance(model, str):                                    │
│ ❱  266 │   │   │   raise ValueError(f"Could not load model {model} with any  │
│    267 │                                                                     │
│    268 │   framework = "tf" if model.__class__.__name__.startswith("TF") els │
│    269 │   return framework, model

有关如何将模型部署为int8的指导非常有用。在进行此操作之前,我需要自己对模型进行量化吗?

lndjwyie

lndjwyie1#

@mallorbc 我刚刚创建了一个分支,应该可以解决这个错误。你可以尝试安装这个版本并再次尝试吗?
pip install git+https://github.com/microsoft/DeepSpeed-MII@mrwyattii/enable-int8-HF
问题的根本原因是我们无法通过HuggingFace加载int8数据类型的模型。这个修复方案是在将dtype设置为int8时,最初使用fp16加载模型,然后当我们将模型提供给DeepSpeed-Inference时,将其转换为int8。

vc9ivgsu

vc9ivgsu2#

感谢mrwyattii的帮助,但这并没有解决问题。我已经尝试过在有和没有DeepSpeed MII的情况下让这个工作正常,这意味着我只尝试了DeepSpeed,然后通过DeepSpeed MII间接地使用DeepSpeed(以防我做错了)。
每次错误都是一样的,请查看下面的跟踪轨迹:

File "/app/server.py", line 220, in generate
    gen_text = gpt_model.query({"query":prompt}, do_sample=do_sample, max_length=total_max_length,min_length=total_min_length,temperature=temp_input,top_k=top_k_input,top_p=top_p_input,early_stopping=early_stopping_input,repetition_penalty=rep_penalty_input,penalty_alpha=penalty_alpha)
  File "/usr/local/lib/python3.8/dist-packages/mii/client.py", line 123, in query
    response = self.asyncio_loop.run_until_complete(
  File "/usr/local/lib/python3.8/dist-packages/nest_asyncio.py", line 90, in run_until_complete
    return f.result()
  File "/usr/lib/python3.8/asyncio/futures.py", line 178, in result
    raise self._exception
  File "/usr/lib/python3.8/asyncio/tasks.py", line 282, in __step
    result = coro.throw(exc)
  File "/usr/local/lib/python3.8/dist-packages/mii/client.py", line 107, in _query_in_tensor_parallel
    await responses[0]
  File "/usr/lib/python3.8/asyncio/futures.py", line 260, in __await__
    yield self  # This tells Task to wait for completion.
  File "/usr/lib/python3.8/asyncio/tasks.py", line 349, in __wakeup
    future.result()
  File "/usr/lib/python3.8/asyncio/futures.py", line 178, in result
    raise self._exception
  File "/usr/lib/python3.8/asyncio/tasks.py", line 280, in __step
    result = coro.send(None)
  File "/usr/local/lib/python3.8/dist-packages/mii/client.py", line 70, in _request_async_response
    proto_response = await getattr(self.stub, conversions["method"])(proto_request)
  File "/usr/local/lib/python3.8/dist-packages/grpc/aio/_call.py", line 290, in __await__
    raise _create_rpc_error(self._cython_call._initial_metadata,
grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
	status = StatusCode.UNKNOWN
	details = "Exception calling application: invalid multinomial distribution (sum of probabilities <= 0)"
	debug_error_string = "UNKNOWN:Error received from peer ipv4:127.0.0.1:50050 {created_time:"2023-03-07T06:20:02.49342625+00:00", grpc_status:2, grpc_message:"Exception calling application: invalid multinomial distribution (sum of probabilities <= 0)"}"

我有点困惑,这是否应该为GPTJ提供即插即用的解决方案。在文档中,我看到有一个量化配置选项,这是从MoQ获得的量化设置。同时,我知道你可以使用像bits和bytes这样的方法获得即插即用的int8。
请参考这里
如果这是预期的工作方式,那么这里有一些bug。如果我需要先进行MoQ,那么我只是在使用DeepSpeed时犯了错误。

gr8qqesn

gr8qqesn3#

啊,我没有尝试使用那个分支运行查询,但我看到同样的错误。我记得在几个月前使用metaTensor加载GPT-J时int8是有效的。我会设置一个环境并使用DeepSpeed进行更多的测试。
另外,感谢你打开了DeepSpeed的问题——我会跟进这个错误。

fjaof16o

fjaof16o4#

感谢您的帮助。希望您能找到解决方案。我会根据您提到的元Tensor查找是否有任何可能有所帮助的信息。

pxy2qtax

pxy2qtax5#

这个错误是由于CUDA没有初始化导致的。你可以尝试以下方法解决这个问题:

  1. 确保你的显卡驱动是最新的。
  2. 检查你的CUDA和cuDNN是否与DeepSpeed兼容。你可以参考DeepSpeed的官方文档来确认兼容性。
  3. 如果问题仍然存在,你可以尝试在运行代码之前添加以下代码来手动初始化CUDA:
import torch
torch.cuda.empty_cache()
torch.cuda.manual_seed(0)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True

希望这些建议能帮助你解决问题。

beq87vna

beq87vna6#

同样的问题,版本细节:

  • deepspeed==0.8.3
  • transformers==4.27.1
  • torch==1.13.0
  • cuda toolkit == 11.7
  • cuda driver == 515.65.07

我的模型是bigscience/bloom-7b1,并且仅在多GPU推理和int8数据类型时出现。

tzxcd3kk

tzxcd3kk7#

对于int8,您不需要事先对权重进行任何量化,对吗?

huus2vyu

huus2vyu8#

对于int8,您不需要事先对权重进行量化,对吗?
是的,只需将func deepspeed.init_inference的dtype参数从fp16更改为int8,并且仅在1个GPU上工作。

yhived7q

yhived7q9#

@mallorbc 我用https://github.com/triton-inference-server/fastertransformer_backend制作了它。
我的模型是bloom-175b,它在8个X A100(80G)上运行,并且使用int8数据类型。经过测试,FasterTransformer是目前最快的推理框架(与deepseed和accelerate相比),而且int8比fp16更快。
你需要做的是用最新的FasterTransformer代码库构建triton_with_ft图像。

相关问题