[THUDM/ChatGLM-6B]chatglm2-6b-32k web_demo.py 多gpu配置bug

2024-05-10 850 views
0
目前的行为

图像 zh这是我在web_demo.py里面的模型加载代码,我这么运行,代码报错,如下: 图像 然后,w我加了device_map="auto",还是报错,如下: 图像

所以,请问我该怎么修改,才能多卡配置成功,请指教,谢谢。 ps:模型已经在本地下载了。

预期行为

请指教

重现步骤

请指教

环境
- OS:
- Python:
- Transformers:
- PyTorch:
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :
还要别的吗?

请指教

回答

1
def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
    # transformer.word_embeddings 占用1层
    # transformer.final_layernorm 和 lm_head 占用1层
    # transformer.layers 占用 28 层
    # 总共30层分配到num_gpus张卡上
    num_trans_layers = 28
    per_gpu_layers = 30 / num_gpus

    # bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
    # windows下 model.device 会被设置成 transformer.word_embeddings.device
    # linux下 model.device 会被设置成 lm_head.device
    # 在调用chat或者stream_chat时,input_ids会被放到model.device上
    # 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
    # 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
    device_map = {'transformer.embedding.word_embeddings': 0,

'transformer.encoder.final_layernorm': 3,
'transformer.rotary_pos_emb':0,
'transformer.output_layer': 3,
'transformer.final_layernorm': 0, 'lm_head': 0}
    used = 2
    gpu_target = 0
    for i in range(num_trans_layers):
        if used >= per_gpu_layers:
            gpu_target += 1
            used = 0
        assert gpu_target < num_gpus
        device_map[f'transformer.encoder.layers.{i}'] = gpu_target
        used += 1

    return device_map

修改utils.py,linux 4张GPU修改后正常

5
def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
    # transformer.word_embeddings 占用1层
    # transformer.final_layernorm 和 lm_head 占用1层
    # transformer.layers 占用 28 层
    # 总共30层分配到num_gpus张卡上
    num_trans_layers = 28
    per_gpu_layers = 30 / num_gpus

    # bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
    # windows下 model.device 会被设置成 transformer.word_embeddings.device
    # linux下 model.device 会被设置成 lm_head.device
    # 在调用chat或者stream_chat时,input_ids会被放到model.device上
    # 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
    # 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
    device_map = {'transformer.embedding.word_embeddings': 0,

'transformer.encoder.final_layernorm': 3,
'transformer.rotary_pos_emb':0,
'transformer.output_layer': 3,
'transformer.final_layernorm': 0, 'lm_head': 0}
    used = 2
    gpu_target = 0
    for i in range(num_trans_layers):
        if used >= per_gpu_layers:
            gpu_target += 1
            used = 0
        assert gpu_target < num_gpus
        device_map[f'transformer.encoder.layers.{i}'] = gpu_target
        used += 1

    return device_map

修改utils.py,linux 4张GPU修改后正常

您好,非常感谢您的回复和建议。您说的这个方法我试了一下,还是报错,如下图: 图像 web.demo.py的代码如下: 图像 6b运行正常,就这32k不行。还请大佬指教

8

如果是modeling_chatglm.py中的presents = torch.cat((presents, kv_cache), dim=0) 这行报错我在前面加上了kv_cache = kv_cache.to(presents.device)多卡配置就成功了

4
def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
    # transformer.word_embeddings 占用1层
    # transformer.final_layernorm 和 lm_head 占用1层
    # transformer.layers 占用 28 层
    # 总共30层分配到num_gpus张卡上
    num_trans_layers = 28
    per_gpu_layers = 30 / num_gpus

    # bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
    # windows下 model.device 会被设置成 transformer.word_embeddings.device
    # linux下 model.device 会被设置成 lm_head.device
    # 在调用chat或者stream_chat时,input_ids会被放到model.device上
    # 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
    # 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
    device_map = {'transformer.embedding.word_embeddings': 0,

'transformer.encoder.final_layernorm': 3,
'transformer.rotary_pos_emb':0,
'transformer.output_layer': 3,
'transformer.final_layernorm': 0, 'lm_head': 0}
    used = 2
    gpu_target = 0
    for i in range(num_trans_layers):
        if used >= per_gpu_layers:
            gpu_target += 1
            used = 0
        assert gpu_target < num_gpus
        device_map[f'transformer.encoder.layers.{i}'] = gpu_target
        used += 1

    return device_map

修改utils.py,linux 4张GPU修改后正常

尝试了这个方法没有用,我也是ubantu系统

6

kv_cache = kv_cache.to(presents.device) 图像 这样吗?

0

如果是modeling_chatglm.py中的presents = torch.cat((presents, kv_cache), dim=0) 这行报错我在前面加上了kv_cache = kv_cache.to(presents.device)多卡配置就成功了

你这个有用,成功了

5

哭了,用了你这个还是报一样的错。还有其他办法吗?

如果是modeling_chatglm.py中的presents = torch.cat((presents, kv_cache), dim=0) 这行报错我在前面加上了kv_cache = kv_cache.to(presents.device)多卡配置就成功了

你这个有用,成功了