Search Posts

作者: chinaoss

理解和运行大模型的本地离线训练、运行流程

帮助初学者理解和运行大模型的本地离线训练、运行流程:

大模型在本地离线运行的流程通常包括以下几个步骤:

  1. 下载训练代码:首先,你需要下载相关的训练代码。通常,大模型的训练代码会在开源的代码库中进行维护,你可以通过GitHub等平台搜索到相应的代码。

  2. 准备环境:在运行代码之前,你需要确保你有相应的环境来支持模型的运行。这包括正确配置Python环境、安装相应的依赖库以及GPU驱动等。

  3. 下载模型数据文件:大模型通常需要预训练的权重文件作为输入。你可以通过官方的提供的链接或者其他渠道下载这些模型数据文件,并保存到本地。

  4. 修改配置:有些大模型的代码会提供一个配置文件,你需要根据自己的需求对配置文件进行修改。配置文件中包括了输入输出文件路径、超参数等设置,你可以根据实际情况进行修改。

  5. 运行代码:根据具体的代码说明,你需要运行相应的命令来启动模型的训练或推理过程。在运行之前,确保你已经正确设置好模型数据文件的路径和其他配置项。

综上所述,要在本地离线训练大模型,你需要下载训练代码、准备环境、下载模型数据文件、修改配置、运行代码。这个流程可能因模型的不同而有所差异,但基本思路是相通的。

如何使用训练好的模型得到输出?

下面是使用已训练好的模型进行推理的一般步骤:

  1. 加载模型:使用相应的深度学习框架(如TensorFlow、PyTorch等),加载已训练好的模型权重文件。通常可以通过指定模型的名称或文件路径来加载模型。

  2. 数据预处理:将输入数据进行预处理,使其与训练数据具有相同的格式和表示。这可能包括词向量化、标准化、缩放或其他必要的数据处理步骤。

  3. 推理过程:根据模型的类型和任务,使用加载的模型对输入数据进行推理。这涉及将输入数据传递给模型,并获取模型的输出结果。

  4. 后处理:根据任务的需求,对模型的输出进行后处理。例如,对于分类任务,可以应用一个阈值来确定最终的类别标签。

  5. 获取输出结果:根据需要,将模型的输出结果格式化为可读的文本、图像、数值等形式,并返回给用户或保存到文件中。

需要注意的是,每个具体模型和任务的实现方式可能有所不同,所以以上步骤需要根据具体的模型和任务进行调整。你可以查阅相关模型的文档或参考例子来了解更详细的使用方法。… 查看余下内容

python机器学习报错 libcufft.so.11: cannot open shared object file: No such file or directory 的问题复现和解决记录

关键报错信息:

libcufft.so.11: cannot open shared object file: No such file or directory

或类似的动态库缺失的报错。

完整报错信息:

Traceback (most recent call last):
  File "/root/miniconda3/envs/mypy38/lib/python3.8/site-packages/torch-2.1.1-py3.8-linux-x86_64.egg/torch/__init__.py", line 174, in _load_global_deps
    ctypes.CDLL(lib_path, mode=ctypes.RTLD_GLOBAL)
  File "/root/miniconda3/envs/mypy38/lib/python3.8/ctypes/__init__.py", line 373, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: libcufft.so.11: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 1, in 
    from simcse import SimCSE
  File "/root/SimCSE/simcse/__init__.py", line 1, in 
    from .tool import SimCSE
  File "/root/SimCSE/simcse/tool.py", line 5, in 
    import torch
  File "/root/miniconda3/envs/mypy38/lib/python3.8/site-packages/torch-2.1.1-py3.8-linux-x86_64.egg/torch/__init__.py", line 234, in 
    _load_global_deps()
  File "/root/miniconda3/envs/mypy38/lib/python3.8/site-packages/torch-2.1.1-py3.8-linux-x86_64.egg/torch/__init__.py", line 195, in _load_global_deps
    _preload_cuda_deps(lib_folder, lib_name)
  File "/root/miniconda3/envs/mypy38/lib/python3.8/site-packages/torch-2.1.1-py3.8-linux-x86_64.egg/torch/__init__.py",
查看余下内容

Centos9/rockylinux9启动提示LVM分区异常的解决办法:device file sys_wwid last seen on not found,timed out waiting for device

问题表现形式

Centos9/rockylinux9 系统使用再生龙(clonezilla)硬盘对拷后,得到的新硬盘的系统启动报错信息:

timed out waiting for device /dev/mapper/rl-home

LVM的逻辑分区有 rl-root,rl-home,rl-swap
其中只有提示 rl-home的问题。但rl-home和rl-root的分区格式都是xfs(换成ext4也一样的报错)。

报错截图:

问题根源:

在 RHEL 9.0 上,LVM 使用持久命名文件 /etc/lvm/devices/system.devices 来查找 PV,例如 IDTYPE、IDNAME、DEVNAME、PVID 等(此配置在 RHEL 9.0 上默认启用,在 RHEL 8.x 上默认禁用。在 AHV 上,克隆或创建快照功能会为 SCSI 磁盘生成新的 PV(在 ESXi 和 Hyper-V 上不会发生这种情况),但持久命名文件 /etc/lvm/devices/system.devices 不会在新虚拟机启动时自动更新。在此问题中,持久命名文件 /etc/lvm/devices/system.devices 中未列出新 PV,这会导致 LVM 忽略新 PV。在操作系统启动期间,原始 PV 中所需的磁盘分区不会挂载,而是 VM 进入紧急模式。

紧急解决方式:

若要从紧急模式恢复 VM,只需执行以下步骤:

  1. 删除原始设备文件:
    root@VM# rm /etc/lvm/devices/system.devices
  2. 创建新的设备文件:
    root@VM# vgimportdevices -a

彻底解决方式:

解决方式一:

编辑系统目录下的lvm的配置文件(/etc/lvm/lvm.conf 的 129行左右)

将其中的

#use_devicesfile=1

修改为

use_devicesfile=0

然后重启。问题解决。
解决方式一的一个可选后续操作为:

root@VM# rm /etc/lvm/devices/system.devices

解决方式二:

要防止虚拟机进入下一个克隆/快照的紧急模式,请执行以下操作:

  1. 在原始 VM 上,暂时禁用设备文件:
    root@VM# mv /etc/lvm/devices/system.devices /tmp/
  2. 创建虚拟机克隆/快照。
  3. 在原始 VM 上,使用设备文件恢复:
    root@VM# mv /tmp/system.devices /etc/lvm/devices/
  4. 在复制的 VM 上,创建新的设备文件:
    root@VM# vgimportdevices -a

参考资料:

  1. https://portal.nutanix.com/page/documents/kbs/details?targetId=kA07V000000LaGrSAK#:~:text=Uncomment%20the%20following%20line%20in%20%2Fetc%2Flvm%2Flvm.conf%20%3A%20use_devicesfile,since%20config%20has%20been%20disabled%3A%20root%40VM%23%20rm%20%2Fetc%2Flvm%2Fdevices%2Fsystem.devices
查看余下内容

Linux的层级架构与Rust的主要模块crate总结,值得转发收藏

Linux的层级架构

每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。

这些分层包括:

  • 用户空间程序
  • 编译器
  • 终端
  • 防火墙
  • 系统调用的跨平台API(特定于平台的系统调用包装API)
  • Rust标准库
  • libc(或等效的API)
  • kernel,操作系统的核心模块
  • 系统资源
  • 内存
  • 文件系统
  • 网络
  • 硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)

Rust的标准库的功能划分

而Rust标准库,很好的利用了操作系统内核提供的API。

Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。

从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准)。

作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。

对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。

Rust标准库包括几大领域的模块,包括四大类:

第一类,Rust语言原语

即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。

如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。

Rust标准包括原语,并在它们之上构建。

第二类,alloc crate

与堆分配值的内存分配相关的类型、函数和特征。

包括集合(Vec、String等集合)、智能指针类型(Box<T>)、引用计数指针(Rc<T>)和原子引用计数指针(Arc<T>))。

第三类,core crate

作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。

第四类,模块(标准库的其他crate)

是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档。例如

  • 为用户程序在多个线程上并发运行的功能在std::thread模块中;
  • 用于处理同步I/O的功能在std::io模块中提供;
  • 针对特定os的模块,主要在std::os模块中实现。

下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)

以下着重对第四类的主要 crate 做一介绍,并附上文档地址

Rust的并发控制相关模块 conurrency:

模块名 说明
std::env 模块 包含与环境变量交互的功能,包括读取、设置和删除环境变量。
std::sync 模块 提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。
std::thread 模块 提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。
std::process 模块 提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。

Rust的内存管理相关模块 memory management:

模块名 说明
std::alloc 模块 提供了内存分配器的功能,包括分配和释放动态内存。
std::convert 模块 提供了用于不同类型之间转换的工具函数。
std::ptr 模块 提供了对指针的操作和转换功能,包括对裸指针的操作。
std::borrow 模块 提供了用于管理借用的功能,包括&&mut借用运算符的实现。
std::default 模块 提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。
std::rc 模块 提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。
std::cell 模块 提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。
std::mem 模块 提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。
std::clone 模块 提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。
std::pin 模块 提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。

Rust的文件系统操作相关模块 File system:

模块名 说明
std::fs 模块 提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。
std::path 模块 提供了与文件路径相关的功能,包括路径的解析、构造和操作。

Rust的数据处理相关模块 data processing:

模块名 说明
std::ascii 模块 提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。
std::fmt 模块 提供了格式化输出的功能,包括对各种数据类型的格式化和打印。
std::num 模块 提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。
std::cmp 模块 提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。
std::hash 模块 提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。
std::ops 模块 提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。
std::iter 模块 提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。

Rust的错误处理相关模块 Error handling:

模块名 说明
std::error 模块 提供了错误处理的功能,包括定义错误类型和处理错误的方法。
std::panic 模块 提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。
std::option 模块 提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。
std::result 模块 提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。

Rust的编译处理相关模块 compiler:

模块名 说明
std::hint 模块 提供了一些用于编译器提示的宏,用于影响编译器的优化行为。
std::primitive 模块 提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。
std::prelude 模块 包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。

Rust的跨语言调用相关模块: FFI

模块名 说明
std::ffi 模块 提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。

Rust的网络处理功能模块 Networking:

模块名 说明
std::net 模块 提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。

Rust的IO处理模块:

模块名 说明
std::io 模块 提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。

Rust的OS特定的功能模块:

模块名 说明
std::os 模块 提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。

Rust的时间处理模块:

模块名 说明
std::time 模块 提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。
查看余下内容

干货总结Rust的应用范围将会爆发,全栈开发者如何看清2023的历史临界点及未来趋势

Rust 诞生已经有 17 年了,最近我考察了将团队的开发技术栈从 Python 生态转到 Rust 生态的可行性。先说结论:99% 可行。

Rust 生态目前的规模

不是 100% 可行,因为 Python 生态的一些名库还未提供 Rust 版本,但请注意到,那些 Python 生态有的功能,Rust 生态里也大部分有了。毕竟 Rust 已经 17 岁了,经过 17 年的积累,Rust 终于快到 “成年” 了。比如 Rust 的线上 Crate 仓库 lib.rs 现有 127219 个包,Python 的 pypi.org 仓库现有 484174 个包(以上统计截至 2023 年 9 月 28 日)、而 Go 语言在 pkg.go.dev 上有超过 170000 个包(截至 2023 年 4 月)。

为什么我决定从 Python 转换到 Rust?如何通过Rust的强大生态工具,提高开发效率和软件质量?

在我的公号里总结分享了 Rust语言解决问题的能力、它能为使用者提高多少效率、最终创造多少价值。

目前(2023 年)正处在 Rust 大规模应用爆发的临界点。大量软件团队正在用 Rust/Go 重写软件。

下面从三个具有代表性的应用实例以及一些 Rust 语言大事件,向读者分享下这个 “Rust 临界点” 的观点。

详情网页链接查看余下内容

rust+Qt+PaddleOCR 实现的OCR桌面软件示例

功能效果

基于paddleOCR 的图片文字识别(OCR)桌面软件,使用Rust+QT开发。

带调试界面的运行效果:

src/ocr.rs 文件的来源:

安装 ruic 工具,https://github.com/jnbooth/ruic
然后

cd src/
ruic.exe -o uic.rs --all mainwindow.ui

就会得到src/uic.rs 。目前已包含 src/uic.rs 文件,所以无需执行上述 ruic 命令。

注意:

  1. ruic.exe 对 QT5 的Line 类 不支持。需要将uic.rs中重复的声明和 Line 相关的声明删掉。
  2. 编译环境要求:qt 5.14.0或低于该版本的qt。windows 10系统。rust qt在windows下的环境要求在有 msvc 编译器的环境,
    所以建议使用:打开【适用于 VS 2017 的 x64 本机工具命令提示】后cd到项目目录下进行cargo 操作。
  3. 在cargo build 之前,要确保按照 【PaddleOCR-json\说明.txt】 文件的要求放置好 PaddleOCR-json 的文件。
  4. main.rs 中 pub type OcrResult = Vec<Root>; 等代码参考了 https://gitee.com/toobo/PaddleOCRRust/blob/master/src/entity.rs ,在此向toobo( ZHao )表示感谢!感谢 PaddleOCR-json 项目

如何编译:

由于技术栈基于 Rust + Qt 5.14.0 + paddleOCR(C++),所以需要借助一些rust crate库实现。编译过程已通过build.rs 脚本进行了一键封装。

编译测试版

cargo build

编译生产版

cargo build --release

授权协议

Apache-2.0

rust+Qt 的其他项目:

  1. 使用 Rust + Qt 开发的仿有道词典的翻译 + 词典 工具.
  2. rust-qt的官方 examples

结论:

使用QT+Rust开发,主要是练手希望熟悉Rust,以及验证rust-qt的成熟度+OCR软件功能的MVP验证。

  1. 关于成熟度:QT C++能支持的功能,rust-qt也支持(目前rust-qt官方支持QT5.14.0 及以下版本的QT,提供了qt_core 、qt_gui、qt_widgets、 qt_ui_tools 等核心模块的crate库)。
  2. 关于开发效率: 对于熟悉Rust的人员,采用rust-qt的开发效率也可以很高,因为UI可以拖拽然后用 ruic 工具生成rust代码(参考 https://github.com/kerneltravel/rust_qt_gui_paddle_ocr_example
查看余下内容

Linux 0.01代码分析:键盘输入字符串到屏幕显示的整个过程

在Linux 0.01 版本中,键盘输入字符串到屏幕显示是通过以下步骤实现的:

  1. 键盘中断处理程序:当用户按下键盘上的键时,硬件会产生一个中断信号,通知操作系统有键盘输入发生。在 Linux 0.01 中,键盘中断处理程序位于 keyboard_interrupt 函数中,它是在 kernel/keyboard.s 文件中定义的。

  2. 中断处理程序的注册:在操作系统启动时,会设置一个中断向量表(interrupt vector table),将键盘中断与相应的处理程序关联起来。在 Linux 0.01 中,这个过程发生在 head.s 文件中的 setup_idt 函数中。

  3. 键盘中断处理程序的执行:当键盘中断发生时,CPU会跳转到键盘中断处理程序的入口地址,即 keyboard_interrupt 函数。在该函数中,将从键盘读取输入字符。

  4. 键盘输入的处理:键盘输入的处理过程包括读取键盘缓冲区中的字符,将其转换为可打印字符,并将其输出到屏幕上。在 keyboard_interrupt 函数中,使用 inb 汇编指令读取键盘缓冲区,并进行相应的处理。

  5. 字符串的显示:在 Linux 0.01 中,字符串的显示是通过调用 BIOS 中断实现的。在 keyboard_interrupt 函数中,使用 int 汇编指令调用 BIOS 中断,将字符显示在屏幕上。

linux0.01的键盘按下到显示到屏幕的流程图

下面是简化的示例代码,展示了 Linux 0.01 中键盘输入字符串到屏幕显示的实现:

# kernel/keyboard.s

# 键盘中断处理程序
keyboard_interrupt:
    pusha               # 保存寄存器状态

    inb $0x60, %al      # 从键盘缓冲区读取字符
    call process_input  # 处理输入字符

    popa                # 恢复寄存器状态
    iret                # 中断返回

# 处理输入字符
process_input:
    cmp $0x01, %al      # 检查是否是按下 Esc 键
    je quit             # 如果是,退出程序

    cmp $0x0E, %al      # 检查是否是按下 Backspace 键
    je backspace        # 如果是,执行退格操作

    cmp $0x0D, %al      # 检查是否是按下 Enter 键
    je newline          # 如果是,换行

    call print_char     # 输出字符到屏幕
    ret

# 输出字符到屏幕
print_char:
    pusha               # 保存寄存器状态

    mov $0x0E, %ah      # 设置显示属性(白底黑字)
    mov $0x0007, %bx    # 设置显示页为 0,光标位置为当前位置

    int $0x10           # 调用 BIOS 中断显示字符

    popa                # 恢复寄存器状态
    ret

# 退格操作
backspace:
    ; 实现退格操作的代码

    ret

# 换行
newline:
    ; 实现换行的代码

    ret

# 退出程序
quit:
    ; 实现退出程序的代码

    ret

请注意,这只是一个简化的示例代码,真实的 Linux 0.01 版本代码更加复杂,包含了更多的功能和细节。此外,这段代码是基于汇编语言编写的,而不是高级编程语言。… 查看余下内容

从本地文件直接加载llama/llama 2/中文llama 的大语言模型的方法

从本地直接加载已有的大语言模型文件,用命令方式或python编程方式从本地直接加载模型文件,适合于模型文件已下载到本地的情况,或者模型文件已随软件一起打包的情况、docker容器化部署的情况,也适用Chinese-Llama-2-7b,可避免部署运行时每次重新联网下载huggingface上的模型的麻烦。

介绍两种方法实现:

  • 命令方式从本地文件直接加载llama/llama 2/中文llama 的大语言模型:
    参考 链接

    1. 在本地编译得到 llama.cpp 的可执行文件(main)后,通过main 加载本地模型文件。
      linux下的编译 + 加载模型的命令为:
      git clone https://github.com/ggerganov/llama.cpp;
      cd llama.cpp && make -j && ./main -m ./models/7B/ggml-model-q4_0.bin -p "Building a website can be done in 10 simple steps:" -n 512
  • 编程方式从本地文件直接加载llama/llama 2/中文llama 的大语言模型:

    1. 安装准备工作:
      pip install llama-cpp-python

      对 mac系统的支持、以及让llama.cpp支持使用 OpenBLAS / cuBLAS / CLBlast / Metal 作为后端的设置方法,可参考 链接

    2. 编程实现
      from llama_cpp import Llama
      llm = Llama(model_path="./models/7B/ggml-model.bin")
      output = llm("Q: Name the planets in the solar system? A: ", max_tokens=32, stop=["Q:", "\n"], echo=True)
      print(output)

      输出结果:

      "id": "cmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "object": "text_completion",
      "created": 1679561337,
      "model": "./models/7B/ggml-model.bin",
      "choices": [
      {
      "text": "Q: Name the planets in the solar system?
查看余下内容

大语言模型如何合并与转换其他模型得到新的完整模型文件

本文介绍了LoRA与原版Llama-2合并得到完整模型的流程本文介绍了LoRA与原版Llama-2合并得到完整模型的流程。本操作属于手动转换(离线转换模型的方式),用于生成不同格式的模型,以便进行量化或进一步精调。本文来源于:中文LLaMA-2 & Alpaca-2大语言模型 Chinese-LLaMA-Alpaca-2 项目的wiki页面 manual_conversion_zh

手动模型合并与转换

以下介绍了手动将LoRA与原版Llama-2合并得到完整模型的流程。如网络带宽充足,建议直接下载完整版模型。

准备工作

  1. 运行前确保拉取【中文LLaMA-2 & Alpaca-2大语言模型 Chinese-LLaMA-Alpaca-2】仓库最新版代码:git pull https://github.com/ymcui/Chinese-LLaMA-Alpaca-2
  2. 确保机器有足够的内存加载完整模型(例如7B模型需要13-15G)以进行合并模型操作
  3. 安装依赖库(项目根目录requirements.txt):
$ pip install -r requirements.txt

Step 1: 获取原版Llama-2-hf模型

原版Llama-2-hf地址:https://huggingface.co/meta-llama/Llama-2-7b-hf

HF格式模型相关文件(可以不用下载safetensors格式模型权重):

config.json
generation_config.json
pytorch_model-00001-of-00002.bin
pytorch_model-00002-of-00002.bin
pytorch_model.bin.index.json
special_tokens_map.json
tokenizer_config.json
tokenizer.json
tokenizer.model

Step 2: 合并LoRA权重,生成全量模型权重

这一步骤会合并LoRA权重,生成全量模型权重。此处可以选择输出PyTorch版本权重(.pth文件)或者输出HuggingFace版本权重(.bin文件)。执行以下命令:

$ python scripts/merge_llama2_with_chinese_lora_low_mem.py \
    --base_model path_to_original_llama2_hf_dir \
    --lora_model path_to_chinese_llama2_or_alpaca2_lora \
    --output_type huggingface \
    --output_dir path_to_output_dir 

参数说明:

  • --base_model:存放HF格式的Llama-2模型权重和配置文件的目录
  • --lora_model:中文LLaMA-2/Alpaca-2 LoRA解压后文件所在目录,也可使用🤗Model Hub模型调用名称(会自动下载)
  • --output_type:指定输出格式,可为pthhuggingface。若不指定,默认为huggingface
  • --output_dir:指定保存全量模型权重的目录,默认为./
  • (可选)--verbose:显示合并过程中的详细信息
查看余下内容

如何在 PaddleOCR 中设置使用 GPU/CPU计算能力?

paddlepaddle的paddleOCR在安装配置阶段,要选对下载的版本,才能支持GPU模式,否则默认支持的是CPU模式

要在 PaddleOCR 中使用 GPU,您需要遵循几个步骤:

  1. 安装 PaddlePaddle 的 GPU 版本: 确保已安装 PaddlePaddle 的 GPU 版本,其中包括 CUDA 和 cuDNN 支持。你可以按照 PaddlePaddle官方的这个文档中提供的说明进行安装。注意选择对应的CUDA版本、操作系统版本、安装渠道等。

  2. 检查 GPU 可用性: 确保 PaddlePaddle 能正确识别你的 GPU。你可以运行以下代码片段来检查PaddlePaddle是否能检测到你的GPU:

import paddle
gpu_available  = paddle.device.is_compiled_with_cuda()
print("GPU available:", gpu_available)
如果输出为 True,则表示 PaddlePaddle 已检测到 GPU。
  1. 在 PaddleOCR 中设置 use_gpu 标志:在代码或配置文件中,确保将 use_gpu 标志设置为 True,以启用 GPU 的使用。例如,如果您使用的是 PaddleOCR API,可以这样设置:
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_gpu=True)
如果使用配置文件,请在配置文件中将 use_gpu 标志设置为 true。
  1. 在推理过程中检查 GPU 的使用情况: 使用 PaddleOCR 执行推理时,可以使用 nvidia-smi(用于英伟达™(NVIDIA®)GPU)等工具或其他 GPU 监控工具监控 GPU 的使用情况。这将帮助你验证 GPU 是否在推理过程中被使用。

如果您已按照上述步骤操作,但仍遇到 PaddleOCR 使用 CPU 而非 GPU 的问题,则可能是其他因素导致了该问题。请确保您的系统环境和依赖项已正确设置为使用 GPU,并仔细检查是否安装了支持 GPU 的 PaddlePaddle。此外,检查 PaddleOCR 初始化或推理过程中的任何错误信息或警告,因为它们可能提供更多有关问题的信息。… 查看余下内容

下一页 »
加好友请备注:chinaoss
您可以在微信公众号联系我们
我们将24小时内回复。
取消