Tangent Space
将tangent space的法线转换到world space,只需要对法线左乘3x3的TBN矩阵即可,无需在TBN矩阵第四列加上P点坐标。这是因为法线只是一个方向向量,平移并不会改变它的朝向。
6a74c1f0566625c5d0ebe03ed0f6895077910f4e47347f54de7afa383dbcb4128ae84b1d47cba5251959d534a93f30fc35757d6b3977fc5d8f961cfc78ed7a8b7fe8e4aa44f5b8ef20468645522cd33dc45d45cd02f78153587258e0751bb1c822af195d5de29407ce764cbdde594c848370eef596ff0e30a8e640274958f1c9af4209b09e7c3b2ff0cc3ab6d7154f85daff636d89216b7f1ea92dac3fff9f1c18b4430a924a424383a19d7383b70c302fc707fb04d9b270690b290e8ab5d09345c688403bca2aeadc9e4a52ffc1c58b0131474bb76a430758ae348077c7d1b35cf0bce43b830019db4d59a66e89e5fed2e54af9462663ce6 ...
CUDA
CUDA Event精确测量GPU kernel的耗时
CUDA Event 是 NVIDIA 提供的 GPU 时间戳工具,直接记录 GPU 硬件的时间,解决了异步问题:
同步机制:
cudaEventRecord() 会在 GPU 的特定时间点插入事件标记,cudaEventSynchronize() 会等待 GPU 执行到该事件。
精确测量:
计算的是 GPU 实际执行核函数的耗时(而非 CPU 时间)。
示例代码(正确方法):
cudaEvent_t start, stop;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord(start); // 记录 GPU 开始时间vectorAdd<<<grid, block>>>(a, b, c, N);cudaEventRecord(stop); // 记录 GPU 结束时间cudaEventSynchronize(stop); // 等待 ...
HPC: 问题集
什么是算子(Operator)?
在计算机科学和高性能计算(HPC)中,算子(Operator)指的是一个特定的数学运算或函数,通常用于描述矩阵、张量或其他数据结构的计算操作。例如:
GEMM(General Matrix Multiplication):通用矩阵乘法算子,计算 C=αA×B+βCC = \alpha A \times B + \beta CC=αA×B+βC。
SpMM(Sparse Matrix Multiplication):稀疏矩阵乘法算子,计算 C=Asparse×BdenseC = A_{\text{sparse}} \times B_{\text{dense}}C=Asparse×Bdense。
其他常见算子:卷积(Convolution)、归约(Reduce)、转置(Transpose)等。
为什么需要手写高性能算子?
定制化需求:
官方库(如cuBLAS)可能不支持某些特殊计算模式(如混合精度、稀疏格式)。
某些场景需要融合多个算子(如GEMM + ReLU),手写可以避免多次内存读写。
极致性能优化:
...
Programming Language
Programming Skill
pwn.college: Learn to hack
Programming Paradigm
Design Pattern
REFACTORING GURU: Design Pattern
Object-Oriented Programming
GeeksforGeeks: Object Oriented Programming in C++
面向对象三大特征之多态 - 一隻小菜鳥的文章 - 知乎
Diffusion
扩散模型入门——个人学习路线+优质博客资料 - Leaf的文章 - 知乎
首先是采样部分。你把一个照片不断加噪音,让它糊掉,于是你得到了一串从清晰到全糊的一串照片。
然后训练的部分,你弄一个AI。你拿相邻的两张照片,比如一张糊了一点和糊了一些的照片放到AI面前,或者95%糊和100%纯gaussian noise给它看,让它找规律。它见得多了,对于任意一张清晰到白噪音的照片,它都能“想起”或者“生成”一张稍微再清晰一点的照片。
最后生成的时候,你拿一张白噪音给它,它就想起自己之前看过的95糊到全糊的训练样本,然后给你一张95糊的。你再把95糊的给它,还你90糊的,以此类推。让它重复个几十次,到最后就给你一张全清晰的。
注意,信息是由网络注入到白噪音里的。
为什么反向去噪过程叫采样?
扩散模型的目标是从一个复杂的概率分布(例如训练数据的分布)中生成样本。在概率论中,从分布中生成数据的过程被称为采样(Sampling)。
正向过程:将数据逐步添加噪声,最终变成标准高斯分布。
逆向过程:从标准高斯分布中逐步采样,生成符合数据分布的样本。
因此,扩散模型的生成过 ...
Learning
Epoch多大合适?
训练 epoch 数量的选择没有固定答案,主要取决于数据规模、模型复杂度和任务难度。以下是系统性的判断方法和实践建议:
一、常见任务的参考范围
任务类型
典型 epoch 范围
说明
简单二分类(小数据集)
10-50
如文本情感分析(数据集<10万条)
复杂多分类(中数据集)
50-200
如新闻分类(数据集100万条左右)
图像分类(ImageNet)
50-120
需要配合学习率衰减
生成任务(GAN/VAE)
100-500
需要更长时间稳定训练
预训练模型微调
3-20
通常少量epoch即可收敛
二、判断训练是否足够的4个信号
Loss/Accuracy 收敛
当验证集loss连续3-5个epoch不下降(或accuracy不提升)时,可停止训练。
示例:# 早停机制(PyTorch伪代码)if val_loss > best_loss for 5 epochs: stop_training()
过拟合迹象
训练集accuracy持续上升,但验证集accurac ...
Sequence Model
Next-token Prediction Models
这两个缺点涉及到next-token prediction models(即基于下一个token预测的模型,如GPT等)在训练和应用中的局限性。我们可以逐一解释:
缺点1:无法引导序列采样以最小化特定目标
解释:在当前的next-token prediction模型中,模型通过teacher forcing(教师强制)进行训练,即模型在每一步预测下一个token时,都基于真实的、正确的历史token序列(ground truth history)。然而,这种训练方式没有提供一种机制来引导模型在生成序列时优化特定的目标函数。
例子:假设我们希望生成的序列满足某种特定的条件(例如,生成的文本需要包含某些关键词,或者生成的视频需要满足某种视觉质量指标)。当前的模型无法在生成过程中主动优化这些目标,因为它只是简单地预测下一个token,而没有全局的优化能力。
问题:模型缺乏对生成过程的全局控制,无法在生成过程中动态调整以最小化某些目标(如生成质量、多样性等)。
缺点2:在连续数据上容易不稳 ...