这是本文档旧的修订版!
强行占用20G的显存
因为某些特定的原因,我们必须占用20G的显存
import torch
import argparse
from math import ceil
def parse_memory_size(memory_str):
memory_str = memory_str.upper()
if memory_str.endswith('G'):
gb = float(memory_str[:-1])
return int(gb * 1024**3)
elif memory_str.endswith('M'):
mb = float(memory_str[:-1])
return int(mb * 1024**2)
else:
raise ValueError("Unsupported unit! Use 'G' (GB) or 'M' (MB), e.g., '20G' or '512M'")
def allocate_vram(memory_str="20G", gpu_id=0):
if not torch.cuda.is_available():
raise RuntimeError("No available GPU for VRAM allocation!")
target_bytes = parse_memory_size(memory_str)
target_gb = target_bytes / (1024**3)
print(f"Target VRAM: {target_gb:.2f} GB")
gpu_props = torch.cuda.get_device_properties(gpu_id)
total_vram_gb = gpu_props.total_memory / (1024**3)
print(f"Current GPU: {gpu_props.name} (Total VRAM: {total_vram_gb:.2f} GB)")
if target_gb > total_vram_gb:
raise RuntimeError(f"Insufficient GPU VRAM! Required: {target_gb:.2f} GB, Available: {total_vram_gb:.2f} GB")
element_size = 4
total_elements = ceil(target_bytes / element_size)
print(f"Required float32 elements: {total_elements:,} (≈ {target_gb:.2f} GB)")
chunk_size = 10**9
tensors = []
allocated_elements = 0
while allocated_elements < total_elements:
current_chunk = min(chunk_size, total_elements - allocated_elements)
tensor = torch.randn(
current_chunk,
dtype=torch.float32,
device=f'cuda:{gpu_id}',
requires_grad=False
)
tensors.append(tensor)
allocated_elements += current_chunk
allocated_gb = (allocated_elements * element_size) / (1024**3)
print(f"Allocated: {allocated_gb:.2f} GB")
used_vram = torch.cuda.memory_allocated(gpu_id) / (1024**3)
cached_vram = torch.cuda.memory_reserved(gpu_id) / (1024**3)
print(f"\nAllocation completed!")
print(f"Used VRAM (allocated): {used_vram:.2f} GB")
print(f"Cached VRAM (reserved): {cached_vram:.2f} GB")
input("\nPress Enter to release VRAM...")
del tensors
torch.cuda.empty_cache()
print("VRAM released")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="GPU VRAM Allocator (default: 20GB)")
parser.add_argument(
"--memory",
default="20G",
help="VRAM size (e.g., '10G' or '512M', default: 20G)"
)
parser.add_argument(
"--gpu",
type=int,
default=0,
help="GPU device ID (default: 0)"
)
args = parser.parse_args()
allocate_vram(args.memory, args.gpu)
评论