transformers库中的Trainer运行出现CUDA out of memory

环境:
多张4090卡

问题:
利用transformers库中的Trainer训练一个Bert模型。


from transformers import TrainingArguments, Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
    compute_metrics=compute_metrics,
    data_collator=data_collator
)

出现out of memory现象,检查发现加载过程中所有的卡都被占满。

原因
没有指定显卡!
如果你不指定 CUDA_VISIBLE_DEVICES,则默认情况下,程序将会看到系统中的所有可用 GPU,并可能根据不同的配置和库的设置情况出现以下几种情况:

自动选择 GPU:

有些深度学习框架(如 TensorFlow、PyTorch)会自动选择一个空闲的 GPU 进行计算。如果第一个 GPU 设备(编号为 0)是空闲的,它通常会被优先选择。
占用所有可用 GPU:

有些情况下,程序可能会占用所有可用的 GPU 设备资源,甚至即使它只在一个 GPU 上运行计算任务。这可能会导致其他用户或进程在尝试使用这些 GPU 时遇到资源冲突。
多 GPU 训练:

如果程序本身支持并配置为使用多 GPU(如分布式训练或数据并行),它可能会自动在所有可用的 GPU 上分配计算任务。
可能的错误或效率低下:

如果你的程序没有有效管理和利用多个 GPU,可能会导致一些不必要的计算资源浪费或效率低下。在某些情况下,如果多个进程试图访问同一 GPU,而 GPU 资源已满,可能会导致程序报错或性能下降。

解决

os.environ["CUDA_VISIBLE_DEVICES"]='2'

os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’ 这行代码的作用是指定使用哪个 GPU 设备进行计算。

CUDA_VISIBLE_DEVICES 是一个环境变量,用于控制哪些 GPU 设备对程序可见。在多 GPU 环境下,你可以通过设置这个变量来指定程序只使用某些 GPU。
os.environ[“CUDA_VISIBLE_DEVICES”] 设置这个环境变量,‘2’ 是你指定的 GPU 的编号。
作用效果:
通过设置 os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’,你的程序会认为只有编号为 2 的 GPU 存在,并且只会在这个 GPU 上运行计算任务。其他 GPU 将对这个程序不可见。
示例:
假设你有 4 个 GPU,编号为 0, 1, 2, 3。如果你设置了 os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’,那么程序会将编号为 2 的 GPU 映射为程序中的 GPU 0,从而只使用这一块 GPU。

使用场景:
在多用户共享 GPU 资源的环境中,可能需要手动指定 GPU,以避免冲突。
如果一个程序只需要一个 GPU,你可以指定一个特定的 GPU 而不是默认使用全部可用 GPU。

<think>好的,用户之前问过Python中的开源大模型应用项目,我介绍了Hugging Face Transformers等项目。现在用户想知道如何学习Hugging Face Transformers,我需要提供一个详细的学习路径。 首先,用户可能是刚接触这个的开发者或学生,他们需要从基础到进阶的学习资源。我应该考虑他们可能的学习方式,比如官方文档、实践项目、社区资源等。 接下来,我需要回忆Transformers的主要功能,比如模型加载、微调、管道使用等。用户可能需要知道如何快速上手,所以分步骤的方法比较有效。例如,先安装,再学习基础API,然后进行微调,最后参与实际项目。 另外,用户可能有不同的学习习惯,有的人喜欢看教程,有的喜欢动手实践。因此,我应该涵盖多种资源类型,如官方教程、视频课程、书籍、社区支持等。 还要注意常见的问题,比如如何处理中文任务,是否需要中文资源。之前提到的Chinese-LLaMA-Alpaca和ChatGLM-6B可能相关,可以推荐他们在中文场景下的应用。 用户可能在学习过程中遇到困难,比如环境配置、调试问题,或者对理论不理解。这时候推荐社区和论坛会有帮助,比如Hugging Face论坛和Stack Overflow。 最后,要强调持续学习的重要性,因为的更新很快,建议用户关注官方动态和最新论文,保持知识更新。总结学习路径的结构,让用户有清晰的路线图。</think>以下是学习Hugging Face Transformers的**系统性路径**,结合官方资源和实践技巧,适合从入门到进阶: --- ### 一、基础准备 1. **前置知识** - 掌握Python基础(函数、类、装饰器) - 理解PyTorch/TensorFlow张量操作和自动求导 - 了解Transformer架构(注意力机制、位置编码) 2. **环境安装** ```bash pip install transformers datasets evaluate # 按需安装深度学习框架 pip install torch # 或 tensorflow ``` --- ### 二、官方学习路线(必看) 1. **官方快速入门教程** - [Hugging Face官方课程](https://huggingface.co/learn)(免费互动式教程,含代码沙盒) - 重点章节: - Pipeline API快速调用模型 - Tokenizer的工作原理 - 微调预训练模型 2. **文档精读顺序** 1. [核心API文档](https://huggingface.co/docs/transformers/main_classes/pipelines):`pipeline`, `AutoModel`, `AutoTokenizer` 2. [微调指南](https://huggingface.co/docs/transformers/training):分类、问答、文本生成任务 3. [模型共享与上传](https://huggingface.co/docs/transformers/model_sharing):将训练好的模型发布到Hub --- ### 三、分阶段实践项目 #### 阶段1:API快速调用 ```python from transformers import pipeline # 情感分析 classifier = pipeline("sentiment-analysis") print(classifier("I love coding with Transformers!")) # 文本生成 generator = pipeline("text-generation", model="gpt2") print(generator("In a shocking discovery, scientists found", max_length=100)) ``` #### 阶段2:自定义模型与训练 ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification from datasets import load_dataset # 加载数据集和模型 dataset = load_dataset("imdb") tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased") # 数据预处理 def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) tokenized_datasets = dataset.map(tokenize_function, batched=True) # 微调训练 from transformers import TrainingArguments, Trainer training_args = TrainingArguments(output_dir="test_trainer") trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_datasets["train"].shuffle(seed=42).select(range(1000)), eval_dataset=tokenized_datasets["test"].shuffle(seed=42).select(range(1000)), ) trainer.train() ``` #### 阶段3:高级应用 - **部署为API服务**:使用`gradio`或`FastAPI`封装模型 - **量化压缩**:应用`bitsandbytes`进行8bit/4bit量化 - **多模态实践**:尝试CLIP(图文匹配)、Whisper(语音识别) --- ### 四、学习资源推荐 1. **书籍** - 《Natural Language Processing with Transformers》(O'Reilly官方书) - 《动手学深度学习》(李沐,含Transformer实现解析) 2. **视频教程** - [Hugging Face官方YouTube频道](https://www.youtube.com/@HuggingFace)(更新频繁) - [吴恩达《ChatGPT提示工程》](https://www.deeplearning.ai/short-courses/)(免费短课) 3. **中文资源** - [Hugging Face中文文档](https://huggingface.co/docs/transformers/zh) - [抱抱脸社区中文博客](https://huggingface.co/blog/zh) --- ### 五、调试与优化技巧 1. **常见错误处理**: - `CUDA out of memory`:减小`batch_size`,启用梯度累积 - 输入长度超限:调整`max_length`或使用长文本处理模型 2. **性能优化**: ```python # 启用混合精度训练 from transformers import TrainingArguments training_args = TrainingArguments(fp16=True) # 使用BetterTransformer加速 model = model.to_bettertransformer() ``` --- ### 六、持续学习 1. 关注[Hugging Face博客](https://huggingface.co/blog)获取最新模型(如Llama 3、Mistral) 2. 参与社区活动: - 在[模型Hub](https://huggingface.co/models)复现Paper实现 - 参加[Hugging Face竞赛](https://huggingface.co/competitions) --- **学习关键点**:先通过Pipeline快速实现功能建立信心,再深入理解Tokenizer和模型结构,最后通过微调掌握全流程。遇到问题时善用[论坛](https://discuss.huggingface.co/)提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值