如何增加Ubuntu的虚拟内存?
📜背景
在配置服务器以运行llama3-8b-instruct的过程中出现内存空间不足的提示:
"/usr/local/lib/python3.10/dist-packages/transformers/modeling_utils.py", line 508, in load_state_dict
with safe_open(checkpoint_file, framework="pt") as f:
RuntimeError: unable to mmap 4976698672 bytes from file </mnt/vdb1/LLM/LLM-Research/Meta-Llama-3-8B-Instruct/model-00001-of-00004.safetensors>: Cannot allocate memory (12)
❓问题
如何增加虚拟内存以便满足llama3-8b-instruct的内存需求?
💡方案
💫命令行知识
🌟dd命令
名称来源
- dd命令的名称来自于“数据传输(Data Definition)”的缩写。尽管原始名称可能令人困惑,但实际上它被广泛用于复制和转换文件,而不仅仅是定义数据结构。
使用方式
dd
是一个用于复制和转换文件的命令行工具。它的基本语法是
dd if=<input-file> of=<output-file> bs=<block-sezi> count=<number-of-blocks>
,其中if
表示输入文件(input file),of
表示输出文件(output file),bs
表示块大小(block size),count
表示块数(number of blocks)。
🌟du 命令
du命令是在Linux系统上用来显示文件和目录磁盘使用情况的命令。du表示"disk usage"。使用du命令可以显示指定文件或目录所占用的磁盘空间大小。如果不指定文件或目录,du命令默认显示当前目录下所有文件和子目录的磁盘使用情况。
du命令的基本语法是:
du [OPTION]... [FILE]...
一些常用的选项包括:
-h
: 以人类可读的格式显示文件和目录的磁盘使用情况,如KB, MB, GB等。-s
: 仅显示指定文件或目录的总磁盘使用情况,而不显示子目录的详细情况。-c
: 显示总计磁盘使用情况,包括所有指定文件或目录的总和。
例如,使用du -sh /home/user1
命令可以显示/home/user1
目录的总磁盘使用情况,并使用人类可读的格式显示大小。
🌟mkswap 命令
mkswap命令的基本语法是:
mkswap [OPTION]... DEVICE
其中,DEVICE可以是一个分区设备文件(如/dev/sda1)或者一个普通文件。
一些常用的选项包括:
-c
: 在创建交换区域时,进行检查并保留坏扇区的信息。-f
: 强制创建交换区域,即使设备似乎被正在使用。
例如,执行mkswap /dev/sdb1
命令可以将/dev/sdb1分区设备文件初始化为交换分区。初始化完成后,可以使用swapon命令将其添加到系统中,使其生效。
🌟swapon/swapoff 命令
swapon和swapoff是Linux系统中用于启用和禁用交换分区或交换文件的命令。
swapon命令用于将指定的交换分区或交换文件激活,使其可以用作系统内存的扩展。其基本语法为:
swapon [OPTION]... DEVICE
其中,DEVICE可以是一个分区设备文件(如/dev/sda1)或者一个普通文件。使用swapon命令激活交换分区后,系统将开始在交换空间中进行交换和页面置换,从而扩展可用的虚拟内存空间。
swapoff命令用于禁用指定的交换分区或交换文件,将其从系统中移除,使其不再用作虚拟内存。其基本语法为:
swapoff [OPTION]... DEVICE
类似于swapon,DEVICE可以是一个分区设备文件或者一个普通文件。
例如,执行swapon /dev/sdb1
命令可以将/dev/sdb1分区设备文件激活为交换分区,而执行swapoff /dev/sdb1
命令可以将其禁用,停止使用作为交换分区。
这两个命令在管理系统内存和交换空间时非常有用,可以根据系统需求动态地调整和管理交换空间的使用。
🌟free -mh
free -mh
命令用于在Linux系统中显示系统内存的使用情况,以及交换空间的情况。该命令会以人类可读的方式显示内存和交换空间的使用情况。
具体来说,-m
选项表示以MB为单位显示内存使用情况。
而-h
选项则表示以人类可读的格式显示内存大小,使用类似"1.2G"的形式。
举个例子,执行free -mh
命令会以人类可读的格式显示系统内存和交换空间的使用情况,包括总内存、已使用内存、剩余内存,以及交换空间的情况
💫磁盘知识
🌟/dev/zero
/dev/zero
是一个特殊的设备文件,在Unix和类Unix操作系统中用于提供无限的字节零流。读取/dev/zero
将始终返回无限的零字节流,而写入/dev/zero
则会将写入的数据丢弃,因为写入的数据都是字节零。
这个设备文件在很多情况下非常有用,例如当需要创建一个特定大小的空文件时,可以使用dd
命令来将/dev/zero
的数据写入到文件中,然后再截断文件到所需的大小。
💫过程
步骤一:创建空文件30G
dd if=/dev/zero of=/mnt/vdb1/ bs=1M count=30240
步骤二:根据空文件制作交换空间
mkswap /mnt/vdb1
步骤三:启用交换空间
swapon /mnt/vdb1
步骤四:查看交换空间
free -mh
🎓评价
通过重新设置交换空间的大小,可以将硬盘的一部分用于扩展linux服务器的内存大小。从而为内存需求量过高的程序如llama的运行提供解决方案。