# LLM推理文档 如果你要使用vllm进行推理加速, 可以查看[VLLM推理加速与部署](../LLM/VLLM推理加速与部署.md#推理加速) ## 目录 - [环境准备](#环境准备) - [推理](#推理) - [Web-UI](#web-ui) ## 环境准备 GPU设备: A10, 3090, V100, A100均可. ```bash # 设置pip全局镜像 (加速下载) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ # 安装ms-swift pip install 'ms-swift[llm]' -U # 如果你想要使用基于auto_gptq的模型进行推理. # 使用auto_gptq的模型: `https://github.com/modelscope/swift/blob/main/docs/source/Instruction/支持的模型和数据集.md#模型` # auto_gptq和cuda版本有对应关系,请按照`https://github.com/PanQiWei/AutoGPTQ#quick-installation`选择版本 pip install auto_gptq -U # 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试) pip install -r requirements/framework.txt -U pip install -r requirements/llm.txt -U ``` ## 推理 ### qwen-7b-chat ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_7b_chat template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: qwen kwargs = {} # kwargs['use_flash_attn'] = True # 使用flash_attn model_id_or_path = None model, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'}, **kwargs) # 修改max_new_tokens model.generation_config.max_new_tokens = 128 template = get_template(template_type, tokenizer) seed_everything(42) query = '浙江的省会在哪里?' response, history = inference(model, template, query) print(f'query: {query}') print(f'response: {response}') query = '这有什么好吃的?' response, history = inference(model, template, query, history) print(f'query: {query}') print(f'response: {response}') print(f'history: {history}') """Out[0] query: 浙江的省会在哪里? response: 浙江省的省会是杭州。 query: 这有什么好吃的? response: 杭州市有很多著名的美食,例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外,还有杭州特色的点心,如桂花糕、荷花酥、艾窝窝等。 history: [('浙江的省会在哪里?', '浙江省的省会是杭州。'), ('这有什么好吃的?', '杭州市有很多著名的美食,例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外,还有杭州特色的点心,如桂花糕、荷花酥、艾窝窝等。')] """ # 流式输出对话模板 inference(model, template, '第一个问题是什么', history, verbose=True, stream=True) """Out[1] [PROMPT]<|im_start|>system You are a helpful assistant.<|im_end|> <|im_start|>user 浙江的省会在哪里?<|im_end|> <|im_start|>assistant 浙江省的省会是杭州。<|im_end|> <|im_start|>user 这有什么好吃的?<|im_end|> <|im_start|>assistant 杭州市有很多著名的美食,例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外,还有杭州特色的点心,如桂花糕、荷花酥、艾窝窝等。<|im_end|> <|im_start|>user 第一个问题是什么<|im_end|> <|im_start|>assistant [OUTPUT]你的第一个问题是“浙江的省会在哪里?”<|im_end|> """ ``` ### qwen-7b-chat-int4 ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_7b_chat_int4 template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: qwen model, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'}) template = get_template(template_type, tokenizer) seed_everything(42) query = '浙江的省会在哪里?' response, history = inference(model, template, query) print(f'query: {query}') print(f'response: {response}') query = '这有什么好吃的?' response, history = inference(model, template, query, history) print(f'query: {query}') print(f'response: {response}') print(f'history: {history}') """Out[0] query: 浙江的省会在哪里? response: 浙江省的省会是杭州。 query: 这有什么好吃的? response: 杭州有很多著名的美食,例如西湖醋鱼、东坡肉、宋嫂鱼羹、叫化鸡等。此外,还有杭州特色的点心,如桂花糖藕、酒酿圆子、麻婆豆腐等等。 history: [('浙江的省会在哪里?', '浙江省的省会是杭州。'), ('这有什么好吃的?', '杭州有很多著名的美食,例如西湖醋鱼、东坡肉、宋嫂鱼羹、叫化鸡等。此外,还有杭州特色的点心,如桂花糖藕、酒酿圆子、麻婆豆腐等等。')] """ ``` ### qwen-7b ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_7b template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: default-generation model, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'}) model.generation_config.max_new_tokens = 64 template = get_template(template_type, tokenizer) seed_everything(42) query = '浙江 -> 杭州\n安徽 -> 合肥\n四川 ->' response, history = inference(model, template, query) print(f'query: {query}') print(f'response: {response}') """Out[0] query: 浙江 -> 杭州 安徽 -> 合肥 四川 -> response: 成都 山东 -> 济南 福建 -> 福州 重庆 -> 重庆 广东 -> 广州 北京 -> 北京 浙江 -> 杭州 安徽 -> 合肥 四川 -> 成都 山东 -> 济南 福建 -> 福州 重庆 """ ``` ### 流式输出 ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference_stream, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_7b_chat template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: qwen model_id_or_path = None model, tokenizer = get_model_tokenizer(model_type, model_id_or_path=model_id_or_path, model_kwargs={'device_map': 'auto'}) template = get_template(template_type, tokenizer) seed_everything(42) query = '浙江的省会在哪里?' gen = inference_stream(model, template, query) print(f'query: {query}') for response, history in gen: pass print(f'response: {response}') # 方式1 query = '这有什么好吃的?' old_history = history gen = inference_stream(model, template, query, old_history) print(f'query: {query}') for response, history in gen: print(f'response: {response}') print(f'history: {history}') # 方式2 query = '这有什么好吃的?' gen = inference_stream(model, template, query, old_history) print_idx = 0 print(f'query: {query}\nresponse: ', end='') for response, history in gen: delta = response[print_idx:] print(delta, end='', flush=True) print_idx = len(response) print(f'\nhistory: {history}') """Out[0] query: 浙江的省会在哪里? response: 浙江省的省会是杭州。 query: 这有什么好吃的? response: 杭 response: 杭州 response: 杭州市有 ... response: 杭州市有很多著名的美食,例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外,还有杭州特色的点心,如桂花酥饼、抹茶糕点等。 history: [['浙江的省会在哪里?', '浙江省的省会是杭州。'], ['这有什么好吃的?', '杭州市有很多著名的美食,例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外,还有杭州特色的点心,如桂花酥饼、抹茶糕点等。']] query: 这有什么好吃的? response: 杭州有许多美食,比如西湖醋鱼、龙井虾仁、酱鸭等。此外,还有许多小吃,如烧麦、春卷、油条等,都是浙江特色美食。 history: [['浙江的省会在哪里?', '浙江省的省会是杭州。'], ['这有什么好吃的?', '杭州有许多美食,比如西湖醋鱼、龙井虾仁、酱鸭等。此外,还有许多小吃,如烧麦、春卷、油条等,都是浙江特色美食。']] """ ``` ### qwen-vl-chat ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_vl_chat template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: qwen model, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'}) template = get_template(template_type, tokenizer) seed_everything(42) query = '这是什么' images = ['https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'] response, history = inference(model, template, query, images=images) print(f'query: {query}') print(f'response: {response}') query = '输出击掌的检测框' response, history = inference(model, template, query, history, images=images) print(f'query: {query}') print(f'response: {response}') print(f'history: {history}') def _fetch_latest_picture(*args, **kwargs): return images[0] tokenizer._fetch_latest_picture = _fetch_latest_picture image = tokenizer.draw_bbox_on_latest_picture(response, history) image.save('output_chat.jpg') """ query: 这是什么 response: 图中是一名女子在沙滩上和狗玩耍,旁边的狗是一只拉布拉多犬,它们处于沙滩上。 query: 输出击掌的检测框 response: 击掌(523,513),(584,605) history: [['这是什么', '图中是一名女子在沙滩上和狗玩耍,旁边的狗是一只拉布拉多犬,它们处于沙滩上。'], ['输出击掌的检测框', '击掌(523,513),(584,605)']] """ ``` ### qwen-audio-chat ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' from swift.llm import ( get_model_tokenizer, get_template, inference, ModelType, get_default_template_type, ) from swift.utils import seed_everything model_type = ModelType.qwen_audio_chat template_type = get_default_template_type(model_type) print(f'template_type: {template_type}') # template_type: qwen model, tokenizer = get_model_tokenizer(model_type, model_kwargs={'device_map': 'auto'}) template = get_template(template_type, tokenizer) seed_everything(42) query = '