Google Colab运行AI绘画生成器遇RuntimeError:索引设备不匹配
解决
accelerate.notebook_launcher运行时的设备不匹配错误 你遇到的错误是因为张量索引(timesteps)与被索引的张量(scheduler.alphas_cumprod)不在同一设备上,导致无法完成索引操作。以下是针对性的解决方案:
1. 统一所有模型与核心张量的设备
在你的training_function内部,添加设备统一逻辑,确保所有组件都运行在Colab的GPU(CUDA)上:
import torch def training_function(text_encoder, vae, unet): # 确定可用设备 device = "cuda" if torch.cuda.is_available() else "cpu" # 移动模型到目标设备 text_encoder.to(device) vae.to(device) unet.to(device) # 移动调度器的核心张量到目标设备 scheduler.alphas_cumprod = scheduler.alphas_cumprod.to(device) # 确保训练过程中生成的timesteps、noise等张量也在同一设备 # 示例:生成timesteps后立即移动 timesteps = torch.randint(0, scheduler.config.num_train_timesteps, (batch_size,), device=device) noise = torch.randn_like(original_samples).to(device) # 后续训练逻辑...
2. 显式配置accelerate.notebook_launcher的进程与设备
由于Colab通常单GPU运行,显式指定进程数为1,避免多进程导致的设备混乱:
accelerate.notebook_launcher(training_function, args=(text_encoder, vae, unet), num_processes=1)
或者提前用Accelerator组件统一准备模型,确保设备对齐:
from accelerate import Accelerator # 初始化加速器并准备模型 accelerator = Accelerator() text_encoder, vae, unet = accelerator.prepare(text_encoder, vae, unet) # 再传入launcher运行 accelerate.notebook_launcher(training_function, args=(text_encoder, vae, unet))
3. 排查训练函数内的张量创建点
检查training_function中所有手动创建的张量(如timesteps、噪声张量),避免在CPU上创建后未移动到GPU。所有需要与模型交互的张量,都要确保调用.to(device)方法。
内容的提问来源于stack exchange,提问作者Neil Malhotra
相关产品推荐
相关产品推荐

