【PyTorch】 RuntimeError: eye_out not supported on CUDAType for Bool

本文解决了在使用PyTorch的eye函数时遇到的错误:eye_out not supported on CUDA Type for Bool。通过将布尔类型更改为无符号整数8位(uint8),成功解决了CUDA设备上的类型不兼容问题。
部署运行你感兴趣的模型镜像

在执行 torch.eye(weights.size(1), dtype=torch.bool, device=weights.device) 这句话的时候,出现了报错信息。

RuntimeError: eye_out not supported on CUDAType for Bool

参考这篇文章,链接
dtype=torch.bool 改为 dtype=torch.uint8,即torch.eye(weights.size(1), dtype=torch.uint8, device=weights.device)

问题解决。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

我是离线推理,不需要发送http请求,我是本地直接请求。 def get_requests(args, tokenizer): # Common parameters for all dataset types. common_kwargs = { "dataset_path": args.dataset_path, "random_seed": args.seed, } sample_kwargs = { "tokenizer": tokenizer, "lora_path": args.lora_path, "max_loras": args.max_loras, "num_requests": args.num_prompts, "input_len": args.input_len, "output_len": args.output_len, } if args.dataset_path is None or args.dataset_name == "random": sample_kwargs["range_ratio"] = args.random_range_ratio sample_kwargs["prefix_len"] = args.prefix_len dataset_cls = RandomDataset elif args.dataset_name == "sharegpt": dataset_cls = ShareGPTDataset if args.backend == "vllm-chat": sample_kwargs["enable_multimodal_chat"] = True elif args.dataset_name == "sonnet": assert tokenizer.chat_template or tokenizer.default_chat_template, ( "Tokenizer/model must have chat template for sonnet dataset." ) dataset_cls = SonnetDataset sample_kwargs["prefix_len"] = args.prefix_len sample_kwargs["return_prompt_formatted"] = True elif args.dataset_name == "burstgpt": dataset_cls = BurstGPTDataset elif args.dataset_name == "hf": common_kwargs["no_stream"] = args.no_stream if args.dataset_path in VisionArenaDataset.SUPPORTED_DATASET_PATHS: dataset_cls = VisionArenaDataset common_kwargs["dataset_subset"] = None common_kwargs["dataset_split"] = "train" sample_kwargs["enable_multimodal_chat"] = True elif args.dataset_path in InstructCoderDataset.SUPPORTED_DATASET_PATHS: dataset_cls = InstructCoderDataset common_kwargs["dataset_split"] = "train" elif args.dataset_path in ConversationDataset.SUPPORTED_DATASET_PATHS: dataset_cls = ConversationDataset common_kwargs["dataset_subset"] = args.hf_subset common_kwargs["dataset_split"] = args.hf_split sample_kwargs["enable_multimodal_chat"] = True elif args.dataset_path in AIMODataset.SUPPORTED_DATASET_PATHS: dataset_cls = AIMODataset common_kwargs["dataset_subset"] = None common_kwargs["dataset_split"] = "train" else: raise ValueError(f"Unknown dataset name: {args.dataset_name}") # Remove None values sample_kwargs = {k: v for k, v in sample_kwargs.items() if v is not None} return dataset_cls(**common_kwargs).sample(**sample_kwargs) 这个是从数据集中构建请求; llm_outputs = llm.generate( input_ids=input_ids, attention_mask=attention_mask, max_new_tokens=32, do_sample=False, ) 这个是根据请求,生成响应。
07-29
<think>我们正在讨论如何修改代码以在本地进行离线推理,而不需要发送HTTP请求。根据用户之前的上下文,他已经在使用Hugging Face的transformers库进行本地推理,但之前的代码可能涉及到了HTTP请求(例如通过API调用远程服务)。现在用户希望完全在本地离线执行。 根据引用[1]和[2],本地离线部署的优势在于自主可控和隐私保护。因此,我们需要确保代码不依赖于任何在线服务。 回顾之前的代码,我们使用的是Hugging Face的transformers库,它本身支持完全离线运行。但是,需要注意以下几点: 1. 模型和分词器需要提前下载到本地,避免运行时在线下载。 2. 代码中不能有请求在线API的部分。 在之前的代码中,我们并没有使用HTTP请求,而是直接加载本地模型进行推理。因此,我们只需要确保: - 模型路径是本地路径 - 设置`local_files_only=True`以避免尝试连接网络 修改建议: 1. 在加载模型和分词器时,确保使用本地路径,并设置`local_files_only=True`。 2. 如果使用量化配置,也要确保相关文件在本地。 具体修改如下: 在`run_hf`函数中,修改模型和分词器的加载方式: ```python def run_hf( requests: list[SampleRequest], model: str, # 这里应该是本地模型路径 tokenizer: PreTrainedTokenizerBase, n: int, max_batch_size: int, trust_remote_code: bool, disable_detokenize: bool = False, ) -> float: # 加载分词器 tokenizer = AutoTokenizer.from_pretrained( model, trust_remote_code=trust_remote_code, local_files_only=True, # 确保只使用本地文件 padding_side="left", ) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token # 加载模型 llm = AutoModelForCausalLM.from_pretrained( model, torch_dtype=torch.bfloat16, quantization_config=bnb_config, # 如果有量化配置,确保也是本地的 use_safetensors=True, trust_remote_code=trust_remote_code, device_map="auto", local_files_only=True, # 确保只使用本地文件 ) ... ``` 此外,在运行脚本时,确保传递的`--model`参数是本地路径,而不是Hugging Face Hub上的模型ID。 另外,为了避免在运行时下载任何文件,我们可以在运行前预先下载好模型。如果使用Hugging Face的模型,可以使用以下命令提前下载: ```bash # 示例:下载模型到本地目录 from transformers import AutoModel, AutoTokenizer model_name = "codellama/CodeLlama-7b-Instruct-hf" local_path = "./local_model" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name) # 保存到本地 tokenizer.save_pretrained(local_path) model.save_pretrained(local_path) ``` 然后在运行基准测试时,将`--model`参数设置为`local_path`。 注意:如果使用了量化配置(如`bitsandbytes`),也需要确保相关配置在本地可用,但通常这些是库自带的,不需要额外下载。 综上所述,我们只需要在加载模型和分词器时添加`local_files_only=True`参数,并确保模型路径是本地路径,即可实现完全离线推理。 另外,如果用户的环境完全无法访问互联网,还需要设置环境变量`TRANSFORMERS_OFFLINE=1`和`HF_DATASETS_OFFLINE=1`,这样Hugging Face库将不会尝试联网。 在代码中,我们也可以设置环境变量: ```python import os os.environ["TRANSFORMERS_OFFLINE"] = "1" os.environ["HF_DATASETS_OFFLINE"] = "1" ``` 这样,即使代码中有其他可能触发网络请求的操作,也会被禁止。 因此,完整的修改包括: 1. 在代码开头设置环境变量(可选,但推荐) 2. 在加载模型和分词器时使用`local_files_only=True` 3. 确保模型路径是本地路径 这样修改后,代码将完全在本地运行,不发送任何HTTP请求。 最后,我们还需要注意,如果使用了Hugging Face的`pipeline`,同样需要设置`local_files_only`。但在我们的代码中,并没有使用`pipeline`,而是直接使用模型和分词器。 如果用户之前是通过API调用在线服务(比如使用`requests`库发送HTTP请求),那么需要将这部分替换为本地模型推理。从用户之前的代码看,并没有使用HTTP请求,所以无需修改。 因此,我们只需要在加载模型时添加两个参数(`local_files_only=True`和设置环境变量)即可。 修改后的完整`run_hf`函数示例: ```python def run_hf( requests: list[SampleRequest], model: str, tokenizer_path: str, # 或者使用model路径作为分词器路径 n: int, max_batch_size: int, trust_remote_code: bool, disable_detokenize: bool = False, ) -> float: # 加载分词器 tokenizer = AutoTokenizer.from_pretrained( tokenizer_path if tokenizer_path else model, trust_remote_code=trust_remote_code, local_files_only=True, padding_side="left", ) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token # 加载模型 llm = AutoModelForCausalLM.from_pretrained( model, torch_dtype=torch.bfloat16, quantization_config=bnb_config, use_safetensors=True, trust_remote_code=trust_remote_code, device_map="auto", local_files_only=True, ) ... ``` 注意:如果分词器和模型不在同一个路径,需要分别指定。通常,它们在同一目录下。 另外,在参数解析时,我们可以允许用户指定单独的分词器路径,但一般不需要。 最后,在`main`函数中,我们可以在最开始设置环境变量: ```python def main(args: argparse.Namespace): # 设置为离线模式 os.environ["TRANSFORMERS_OFFLINE"] = "1" os.environ["HF_DATASETS_OFFLINE"] = "1" ... ``` 这样,整个脚本将不会进行任何网络请求。 综上所述,修改后的代码将支持完全离线推理。 相关问题: 1. 如何确保Hugging Face模型在加载时不连接网络? 2. 如何提前下载Hugging Face模型以供离线使用? 3. 在完全离线的环境中运行Hugging Face模型需要设置哪些环境变量? 4. 如何为离线模型进行量化配置?</think>要修改代码以实现本地离线推理(无需发送HTTP请求),可以按照以下步骤操作。这些修改基于Hugging Face Transformers库的本地推理能力,确保所有计算都在本地设备上完成: ### 1. 确保模型完全本地化 在加载模型时添加`local_files_only=True`参数: ```python def run_hf(...): # 加载本地模型(不再从Hugging Face Hub下载) llm = AutoModelForCausalLM.from_pretrained( model, local_files_only=True, # 关键参数[^1] torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True ) # 加载本地分词器 tokenizer = AutoTokenizer.from_pretrained( model, local_files_only=True, # 关键参数[^1] trust_remote_code=True, padding_side="left" ) ``` ### 2. 禁用所有网络连接 在代码开头添加环境变量设置: ```python import os os.environ["TRANSFORMERS_OFFLINE"] = "1" # 禁用Transformers网络连接 os.environ["HF_DATASETS_OFFLINE"] = "1" # 禁用数据集下载 os.environ["HF_HUB_OFFLINE"] = "1" # 完全禁用Hub访问 ``` ### 3. 实现纯本地推理流程 修改推理函数避免任何外部调用: ```python def local_inference(prompt, model, tokenizer): """纯本地推理函数""" inputs = tokenizer(prompt, return_tensors="pt").to(model.device) outputs = model.generate( **inputs, max_new_tokens=64, do_sample=False ) return tokenizer.decode(outputs[0], skip_special_tokens=True) # 在批处理中调用 def process_batch(batch): results = [] for prompt in batch: results.append(local_inference(prompt, llm, tokenizer)) return results ``` ### 4. 添加模型预加载检查 确保模型已完全下载到本地: ```python def check_model_local(path): required_files = ["pytorch_model.bin", "config.json", "tokenizer.json"] return all(os.path.exists(os.path.join(path, f)) for f in required_files) def main(args): if not check_model_local(args.model): raise RuntimeError("模型文件不完整,请先下载完整模型到本地[^1]") # ...其余代码... ``` ### 5. 完整离线推理示例 ```python import os import torch from transformers import AutoModelForCausalLM, AutoTokenizer # 强制离线模式 os.environ["TRANSFORMERS_OFFLINE"] = "1" def run_offline_inference(model_path, prompts): # 加载本地资源 tokenizer = AutoTokenizer.from_pretrained(model_path, local_files_only=True) model = AutoModelForCausalLM.from_pretrained( model_path, device_map="auto", torch_dtype=torch.bfloat16, local_files_only=True ) # 批量推理 results = [] for prompt in prompts: inputs = tokenizer(prompt, return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=128) results.append(tokenizer.decode(outputs[0], skip_special_tokens=True)) return results # 使用示例 if __name__ == "__main__": model_path = "/local/path/to/model" # 本地模型路径 prompts = ["def factorial(n):", "// 快速排序实现"] print(run_offline_inference(model_path, prompts)) ``` ### 6. 模型部署前准备 使用以下命令将模型完全下载到本地: ```bash # 下载模型和分词器 from transformers import AutoModel, AutoTokenizer model = AutoModel.from_pretrained("codellama/CodeLlama-7b-Instruct-hf") tokenizer = AutoTokenizer.from_pretrained("codellama/CodeLlama-7b-Instruct-hf") # 保存到本地目录 local_path = "./local_code_model" model.save_pretrained(local_path) tokenizer.save_pretrained(local_path) ``` ### 优势说明 1. **完全离线**:所有计算在本地NPU/GPU完成,无网络依赖[^1] 2. **数据安全**:敏感代码不会离开本地环境[^1] 3. **低延迟**:省去网络传输开销,推理速度提升30-50%[^2] 4. **定制自由**:可随意修改本地模型和推理逻辑[^1] ### 验证离线状态 在代码中添加检查: ```python import requests try: requests.get("https://huggingface.co", timeout=1) print("警告:网络连接可用,请检查离线设置!") except: print("离线模式验证成功") ``` > 注意:部署前需确保模型完整下载,推荐使用`huggingface_hub`库的`snapshot_download`功能下载所有依赖文件[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值