主页

LLaMA Factory 训练中 SDPA 引发 grad_norm 为 NaN 问题解决

在使用 LLaMA Factory 进行模型训练时,问题:训练起步的时候梯度范数(grad_norm)显示为 NaN。相关的日志输出: /usr/local/lib/python3.12/dist-packages/torch/autograd/graph.py:825: UserWarning: cuDNN SDPA backward got grad_output.strides() != output.strides(), attempting to materialize a grad_output with matching strides... (Triggered internally at /opt/pytorch/pytorch/aten/src/ATen/nati...

阅读更多

prime_server:基于ZeroMQ的高性能分布式服务框架

介绍 从Valhalla项目发现了一个非常有趣的服务器库—prime_server,这是一个基于ZeroMQ构建的非阻塞式web服务器API,专为分布式计算和面向服务架构(SOA)设计。 架构特点:蝴蝶模式 prime_server采用了ZeroMQ中的”蝴蝶模式”(Butterfly Pattern)或”并行管道模式”(Parallel Pipeline Pattern)。这种设计模式在ZeroMQ教程中有详细描述。 基本架构如下: client <---> server ---> proxy <---> [worker pool] <---> proxy <---> [worker pool] <---> ...

阅读更多

基于AOF的Redis Migrate Tool

Redis Migrate Tool (RMT) 是唯品会(Vipshop)开发的一款高性能Redis数据迁移工具,支持多种Redis部署模式间的数据迁移,包括单实例、Twemproxy、Redis集群以及从RDB/AOF文件加载数据 RMT工具概述 RMT具有以下核心特性: 高速多线程迁移 基于Redis复制协议 在线迁移(源Redis可持续服务) 异构迁移(支持不同Redis部署模式间转换) 支持Twemproxy和Redis集群 迁移状态实时查看 数据验证机制 AOF迁移配置示例 AOF迁移的典型配置如下: [source] type: aof file servers: - /data/redis/appendonly1.aof -...

阅读更多

Redis 简单动态字符串(SDS)详解

Redis 中的字符串实现是一个被称为简单动态字符串(Simple Dynamic String, SDS)的抽象数据类型,它不仅是Redis字符串对象的底层实现,也是Redis内部几乎所有需要字符串表示的地方的基础数据结构。下面让我们深入了解SDS的设计与实现。 SDS(简单动态字符串)和前文讨论的Redis字符串对象是两个不同层次的概念,它们之间存在层次关系:SDS是Redis字符串对象的底层实现方式之一。 层次关系 Redis对象层:字符串对象(StringObject)是Redis的高层抽象,是一种redisObject结构 编码实现层:StringObject可以使用三种不同的编码方式(INT、EMBSTR、RAW) 底层数据结构:当使用EMBSTR或RAW...

阅读更多

Redis 字符串对象的极致优化(造轮子)

字符串的三种编码方式 Redis 字符串对象(robj)可以使用三种不同的编码方式存储: switch(encoding) { case REDIS_ENCODING_RAW: return "raw"; // 原始SDS case REDIS_ENCODING_INT: return "int"; // 整数 case REDIS_ENCODING_EMBSTR: return "embstr"; // 嵌入式字符串 // 其他编码... } 这三种编码各有特点: INT 编码:将字符串作为整数值直接存储 EMBSTR 编码:短字符串的优化存储方式 RAW 编码:常规字符串存储方式,适用于长字符串 ...

阅读更多

当我们在启动redis的时候,我们在启动什么

省流版本 main() server.c -> InitServer aeCreateEventLoop listenToPort -> aeMain() -> aeProcessEvents() -> aeApiPoll -> epoll gdb 调试环境 获取代码 使用redis-3.0-annotation版本的代码进行分析,这个版本带有详细的中文注释。 编译设置 首先编译Lua相关代码: cd deps/lua/src make linux 然后编译Redis,开启调试信息: make MALLOC=libc CFLAGS="-g -O0" -j 16 GDB调试 gdb ./redis-server b main...

阅读更多

Redis高性能I/O架构解析:同步RIO与异步BIO

Redis作为一个高性能的内存数据库,其卓越的性能不仅源于内存操作的高效性,还得益于其精心设计的I/O处理架构。在Redis内部,RIO(Redis Input/Output)和BIO(Background I/O)是两个核心组件,它们以不同的方式优化I/O操作,共同构成了Redis高性能I/O处理的基础。本文将深入剖析这两个组件的设计思想、实现细节及其在Redis中的应用。 RIO:统一的I/O抽象层 设计理念 RIO是Redis实现的一个抽象I/O层,其核心思想是提供统一的接口来处理不同类型的I/O操作,无论是文件I/O、内存缓冲区还是网络连接。这种抽象使得上层代码可以专注于业务逻辑,而不必关心底层I/O的具体实现。 核心结构 struct rio { // 读取...

阅读更多

深入比较:Go的压缩库与GNU gzip的实现差异

引入 go 里的 gzip 打包 大小和c++ 调用的gzip 不一样 找了下go的 gzip是这个 https://github.com/klauspost/compress go + zip -> gzip c++的gzip https://ftp.gnu.org/gnu/gzip/ gnu + zip -> gzip 但是两者都是用了 DEFLATE 算法 DEFLATE算法基础 在比较两种实现前,让我们先了解它们共同的基础——DEFLATE算法: DEFLATE是一种结合了LZ77和哈夫曼编码的无损压缩算法: LZ77压缩:通过滑动窗口技术寻找重复数据,用(距离,长度)对替代重复内容 哈夫曼编码:根据字符出现频率分配变长编码,频率高的字...

阅读更多