Everything you care about in one place

Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.

Get Feeder

terenceli.github.io

不忘初心 方得始终

Get the latest updates from 不忘初心 方得始终 directly as they happen.

Follow now 99 followers

Latest posts

Last updated about 2 months ago

CWPP 的下一站 - AntCWPP

about 2 months ago

熟悉本blog的同学应该知道,这里很少分享公司相关的东西。因为我的观念是公司里面工作相关的思考或者内容是不适合放到个人blog的,所以我一般是分享相对独立问题或者是自己的一些学习内容。但是随着AntCWPP的中英文蓝皮书的发布,我在这里准备从个人的视角写一些关于AntCWPP的东西,这个文章不会像蓝皮书那么官方和正式。 传统CWPP的问题 下面是一个典型的CWPP需要具备的功能。图片来自Gartner,是我从这里复制过来的。 这些功能本质就是保证运行时的workload的安全,能够及时发现、阻断攻击。我们根据这些功能在实践中的实现难度分为三类: 安全审计类,对应上面的workload 行为监控、检测与响应 系统层面安全防护,上述的HIPS、Exploit拦截、应用行为白名单、系统完整性保证属于此类 基于身份的管控,这里的核心是要为workload进行身份管理,并且基于身份实现安全策略的管控。上述的基于身份的微隔离属于此类 上述这三类本质上都是要在workload运行时,当特定事件发生时进行记录或者根据策略进行enforce,这是CWPP的核心功能。上面图中的恶意软件扫描和系统加固、配置漏洞管理可以理解为workload在某一个时刻的快照,这种能力实现起来比较简单。 CWPP中workload的安全审计、安全防护与身份管理是其核心,也是其实现的难点。当前的CWPP方案都是基于runc容器,有基于内核模块的,也有基于eBPF的,但是在线上生成环境中很难实现上面的CWPP功能,列举如下: 审计的功能很难做到丰富,比如DNS和文件的审计,这些功能的审计容易影响到系统的性能和稳定性 安全防护策略不好做,安全防护涉及到拦截,一旦拦截错了影响业务怎么办?并且要对上面的应用实现行为白名单,更加困难,首先要识别容器,其次要识别进程。防护策略不好实现的另一个例子容器逃逸,由于容器逃逸有各种方式,所以很难彻底防护...

大模型量化简介

2 months ago

本文记录下学习大模型量化过程中的过程,本文不涉及高深的各种量化策略以及量化效果对比,只是记录对量化过程的探索。量化的含义本质上很简单,即将模型的存储数据从浮点数转换为整数,从而降低显存使用,那这个过程中必然有数值的转换、模型保存、加载。但是在研究量化的过程中所用时间超过了之前的LoRA,因为实际过程中有很多坑,光看网上文章是不会理解的,具体来说,起码有下面几个: transformers自身支持的量化方案,也就是 load_in_8bit 参数需要依赖 bitsandbytes,这个库在Windows上支持很不友好,也依赖GPU。 直接使用quanto库进行量化有问题,需要optimum-quanto 量化效果不显著,是因为量化通常来说只量化Linear以及Norm层,很多层都不量化,比如用GPT2测试,就会有很多层不会量化 使用quanto的quantize进行量化之后,还需要freeze才会将weight改成INT8类型 下面开始对量化的探索。 量化简介 大模型量化指的是将模型参数从高精度(比如FP32, 4字节)转换为低精度(比如INT8,...

LoRA微调简介

3 months ago

大模型微调简介 微调, 指在一个已经预训练好的大模型基础上,使用一个特定任务或领域的较小规模数据集,对该模型进行进一步的训练,让通用的“通才”模型,快速、高效地转变成一个特定任务的“专才”模型,而不需要从头开始训练。 比如原始的GPT模型,其实只是一个预测下一个token概率的模型,要让其成为聊天机器人,还要用数据对齐进行微调。 微调的基本概念如下。 下面是deepseek生成的伪代码,其核心过程如下: 初始化,加载已经经过预训练的大模型,比如各个大公司的模型 准备数据集,准备用来微调的数据,比如对于聊天的大模型,就是各个聊天数据 配置参数,比如更新参数的方式以及损失函数的计算 训练,这里的训练把数据集中的样本作为输入,走一遍模型的推理,然后把模型的结果与样本的标签计算损失函数,做返现传播从而更新模型的参数 最终把模型参数保存起来,完成了一次微调 #...

vLLM源码(V0)结构分析

4 months ago

vLLM使用通常如下(本地推理,非服务): from vllm import LLM llm = LLM(model="facebook/opt-125m") outputs = llm.generate("Hello, my...

vLLM中的Paged Attention分析

4 months ago

基本概念 上一篇文章中介绍了KV cache的概念以及作用,由于KV cache在推理中的作用性能提升很大,所以现在各种推理框架都会支持KV cache。本文介绍vLLM中的核心原理Paged Attention的实现,本文不会详细介绍vLLM的基本原理以及vLLM整体的源码架构分析(将来有机会争取写一下),所以假设读者需要熟悉大模型的基本推理过程以及vLLM基本代码架构,图解大模型计算加速系列之:vLLM核心技术PagedAttention原理文章是不错的介绍vLLM Paged Attention的原理性文章。 推理框架在进行推理过程中一个重要的环节是计算各个token之间的自注意力,KV cache保存了之前token的KV值,在计算当前token时,会引用KV cache中值。vLLM Paged...

transformer库中的kv cache分析与调试

5 months ago

这篇文章记录了kv cache到底cache的是啥,以及为啥kv cache能够work。在研究kv cache的时候,有两个问题困扰我很久。 为什么说只有causal模型能够使用kv cache transformer中默认代码里面没有使用causal mask kv cache原理 我们知道,transformer里面一个重要环节是做self attention,而self...

大模型是如何进行推理的?-transformer的一点代码调试分析

5 months ago

背景 最近在学习LLM,网上资料很多,很多都是洋洋洒洒讲了一堆原理,公式、图表一堆,这些当然很重要,但是如果能有系统性的相关代码分析与调试则更能让初学者有直观的体验。这部分不能说没有,但是也不多,并且比较零散。本文试图从transformer库的代码调试分析大模型的一次推理过程,让初学者能够理解推理的本质过程。下面的图展示了大模型一次推理的基本流程。初始的prompt输入之后,经过Tokenizer、Embeding,输入字符变成相关向量,并且经过大模型神经网络的一次forward,输出vocab size大小的tensor,每个表示该词的概率大小。最终选取概率最大的作为next token。 本文主要就是从代码层面分析这个流程。 具体来讲,本文包括如下部分: 通过transformer使用大模型。在使用过程中,我们提出下面三个问题:模型文件究竟是啥?模型文件是如何加载到模型中的?具体某个模型比如qwen模型结构分析。并在随后的部分依次解答。 safetensors模型文件分析 safetensors模型文件加载到模型过程分析 模型的整体推理过程 本文使用的大模型为 DeepSeek-R1-Distill-Qwen-1.5B,这个模型能够在CPU上跑。...

Deploy a 'hello world' model serving using triton server without GPU

6 months ago

The first is reproduced and modified from here. This uses fashion mnist...

lguest internals

7 months ago

lguest is the simpliest x86 virtualization solution. It is a paravirt hypervisor...

Run lguest on Linux kernel 4.4

about 1 year ago

Background Recently, I am preparing to study the PVM solution proposed by...

The anatomy of chroot escape

over 1 year ago

Recently I have read the old chroot escape methods in Linux. Using...

Multi-thread process can't unshare pid namespace (in some old Linux version)

over 1 year ago

The issue When we unshare CLONE_NEWPID in a go program, we got...