跳转至

2024

lmdeploy推理do_sample崩溃问题

采用server方式推理一个模型,会崩溃。

采用pipeline方式推理一个模型,不会崩溃。

不管是server还是pipeline,都调用了同样的generate()方法,但是为什么会产生不同的结果?传递的参数不同。

实现一个neovim插件nvim_rotate_chars来轮转代码

文章介绍了如果实现一个轮转代码的neovim插件,简单的策略就是a->b, b->c, …, z->a。 试想一下你的代码经过轮转以后会是怎么样,轮转一个位置、n个位置呢?配上快捷键,在别人看你代码的时候,轮转一下字符,向左转了还能支持向反方向转回来。需要实现如下功能:

  • 支持指定轮转的步数、方向(即向左向右);
  • 支持unicode字符,比如中文字符的改变;
  • neovim配置快捷键和command命令行输入;
  • 采用rust和lua编写,基于nvim-oxi,和传统rpc不同,直接调用c-api bind。

听起来还有点传统的代码加密算法的意思,旋转加密或者叫轮转机加密。

实现一个neovim插件转换unicode字符到中文显示

上一篇讲了如何通过nvim-oxi实现一个neovim插件nvim_rotate_chars来轮转字符,这一篇通过采用相关技术实现了一个unicode字符表示转换成汉字显示。这些工具在日常开发和工作中都可以用到,自己实现一个也可以学到新东西练练代码手感。

之前在文章unicode编码和utf-8转换不同语言实现的差别?以及locale杂谈中讲到过由于系统的locale设置不正确,遇到unzip解压出来的中文文件名称都变成了unicde的16进制字符表示。当然也介绍了如何使用python、c++以及rust实现转换。在这里我们将实现移植到了neovim插件中,打开文件一键转换。

GPU的pin_memory是什么?

gpu的pin_memory

pin_memory就是在RAM上固定了一块内存,这个内存范围是被锁住的。pin这个单词很形象,很像rust中pin含义,用钉子把钉住,这个内存就不会释放,是安全的意思。GPU在传递数据的时候,就可以用DMA的方式,高效传输数据。否则,普通的cpu_memory,就会swap掉,然后访问的时候缺页中断,这样速度肯定就慢了很多。

text-generation-inference推理框架剖析

今天要介绍的主题是TGI(text-generation-inference), 是huggingface开源可用于生产环境的LLM大模型的推理部署服务。

由Router和Engine构成,Engine包括了InferServer。Router由Rust实现,InferServer由python端实现。Router相当于一个代理,面向业务会启动一个WebServer,包括对业务请求采用合适的策略进行动态Batch调整,实现大的吞吐和低的延迟。 Engine对各种LLM大语言模型进行支持,启动模型推理服务。 Router和Engine之间通过Protobuf定义消息和格式,通过GRPC方式就可以对推理服务进行访问。

C++如何实现FP16(IEEE754-2008)类型?

计算机在进行数值计算时,首先需要对数据进行表示,比如F32、F16、F64、int32、int16、int8等等。特别在深度学习中,如果模型的参数是F32类型,那么计算耗时且保存的参数占用内存大。

为了准确率同时保证计算的速度,一般需要把模型转换成F16类型。F16即是通过16个bit(位)表示浮点数类型。

我们一起看一下:

  • IEEE754-2008如何定义Float32和Float16的?
  • float32和float16如何转换?在C++23版本以下标准库是没有f16类型的。
  • Float16不用转换成float32比较,如何直接比较大小?