2025
Begin to share my tech blog here
2025-03-30
今天我迁移了一下博客
从今往后 主要在这里记录和分享技术
2025-04-07
帖子地址:点击跳转
事情的起因是这样的
我在这篇帖子中给L站编写了一个简单的MCP Server
https://linux.do/t/topic/527169
https://github.com/Pleasurecruise/linux-do-mcp
我一开始的设想是能够部署一个远端的SSE地址 这样大家在使用时就只需要填一个链接了
然而事与愿违
现如今我们在使用一些MCP server的时候,难免会遇到一些需要用户高权限的情景。这种情况又分为两种:
- 一种是请求本地资源权限的
- 一种是请求远程资源权限的(一般在互联网服务商处)
目前似乎还没有一种成熟的方式来解决这个问题 最近看到高德地图对于他们自家的地图MCP server给出的解决方法类似如下
https://mcp.amap.com/sse?key=xxx
是通过将apikey作为请求参数进行传输的
那么问题来了
这样的方式真的安全或者具有普适性吗
高德地图因为有大厂的光环以及是自家提供的服务 这样传输apikey几乎不存在安全问题
但是如果当个人开发者想要编写MCP server 用的是自己提供的远程地址 向你请求如此高权限的apikey时 你敢提供给他吗
另外将env作为http请求参数进行传输的方式本就不太合理
我看目前主流的解决方式是通过Oauth2认证的方式
高德地图似乎是因为没有Oauth2认证?还是因为目前mcp技术尚不成熟所以就没这样做?
于是话又说回来了,既然这样的方式传输env不合理那就只能采取OAuth认证的方式
然后我就去研究了一下LINUX DO CONNECT的OAuth授权,
从用户信息端点:https://connect.linux.do/api/user
来看 最终的响应确实会返回一个api_key
字段,但是只有查看用户基本信息的权限
向我的在项目中写的,需要用户鉴权比如(查看发布,书签等等 都无法实现了
综上所述,所以我给linux-do-mcp
部署sse地址的设想只能搁置了
2025-05-20
今天想着重讨论一下在代码中遇到的那些循环引起的bug
一个是springboot中的循环引用,一个是react中的循环渲染
在过去刚开始写代码的日子里,我经常会无意间写出上述的这些bug,直到编译后开始运行,遇到内存泄漏运行卡顿等报错的时候,才发现这些bug的存在。不只是人类,如今的AI编程也是一样,它也会写出这些bug,在IDE中看似没有问题的代码,在运行时却会出现报错。
① springboot中的循环引用
简而言之,两个或多个Bean相互依赖,形成一个闭环的依赖链。
而且Spring的自动装配机制容易掩盖依赖关系,业务逻辑层和数据访问层等边界模糊。
举一个非常简单而经典的例子:
@Service
public class A {
@Autowired
private B b;
}
@Service
public class B {
@Autowired
private A a;
}
最好的解决方法就是:重构代码,理清业务逻辑,消除循环依赖
虽然AI会给出一些建议,比如:添加@Lazy注解,但是这些建议往往是只是暂时解决了问题,会一定程度上影响性能。
② react中的循环渲染
简而言之,一个组件在渲染过程中,无限制地触发自身或其他组件的重新渲染,会多次调用自身的render方法
出现循环渲染会导致页面卡顿甚至程序崩溃
举一个非常简单而经典的例子:
function App() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
在这个例子中,App组件的render方法会被调用两次,一次是在初始渲染时,一次是在点击按钮时。
正确使用react钩子,添加合理的渲染条件判断,共享状态提升等都是很好的解决方法。
③ react钩子
useState 是最基本的 Hook,它让函数组件能够拥有自己的状态。
useEffect 是一个 Hook,它可以让你在函数组件中执行副作用操作。
useContext 是一个 Hook,它可以让你在函数组件中访问 Context。
useRef 是一个 Hook,它可以让你在函数组件中访问 DOM 节点。
useReducer 是一个 Hook,它可以让你在函数组件中使用 Redux。
useCallback 是一个 Hook,它可以让你在函数组件中缓存函数。
useMemo 是一个 Hook,它可以让你在函数组件中缓存计算结果。
④ context
Context 是 React 提供的一种在组件树中共享数据的方式,无需通过 props 手动传递数据到每一个需要它的组件。
在 React 应用中,数据通常是通过 props 自上而下(从父组件到子组件)传递的。但对于某些类型的属性(如地区偏好、UI 主题、用户认证信息等),这些属性需要在应用的许多组件之间共享,使用 props 传递会变得非常繁琐。Context 提供了一种在组件之间共享这些值的方式,而不必显式地通过组件树的每个层级传递 props。
⑤ react complier
React19 引入的 React Complier 实现了自动化编码 避免了不必要的重复渲染 不再需要 useCallback useMemo 等依赖数组来进行内存管理
相关文档:https://zh-hans.react.dev/learn/react-compiler
2025-06-06
想记录一下 AI 模型训练和微调的过程中,需要用到的一些脚手架以及项目常用cli使用方式
e.g. llama-factory ms-swift unsloth vllm sglang
主要针对 linux 公网图形服务器
① llama-factory
启动以及使用gradio
WebUI 面板
GPU服务器 公网访问
export GRADIO_SHARE=true
llamafactory-cli webui
② ms-swift
启动以及使用gradio
WebUI 面板
swift web-ui --lang zh --share true
一些推理加速和高效微调的库
vllm: 基于 Paged Attention 实现高效解码。支持吞吐量优化和低延迟生成。
sglang: 是一个结构化生成语言,提供前端语言和运行时系统,优化复杂 LLM 程序的执行。支持多模态输入、并行控制和 KV 缓存重用。专注于执行复杂应用,如代理控制、逻辑推理和多轮对话,适合编程需要多个生成调用和控制流的 LLM 应用。
unsloth: 专门为 LLM 微调和强化学习设计的开源框架,优化了速度和内存使用。支持 QLoRA 和 LoRA 等技术,适合在有限硬件资源上进行微调。
什么是超参数?常见的超参数有:
· 随机种子(Random Seed):随机种子是指在模型训练过程中用于初始化随机数生成器的固定值。它可以确保模型在不同的训练过程中使用相同的随机数序列,从而提高模型的可重复性。通常需要根据具体任务进行调整。
· 学习率(Learning Rate):学习率是指模型在训练过程中更新权重的步长大小。它决定了模型参数更新的速度,通常需要根据具体任务进行调整。较小的学习率可能会导致模型收敛缓慢,而较大的学习率可能会导致模型在训练过程中不稳定。
· 批量大小(Batch Size):批量大小是指在模型训练过程中每次迭代所处理的样本数量。它直接影响到模型参数更新的方向,通常需要根据可用内存和显存进行调整。较小的批量大小可能会导致模型训练过程中震荡,而较大的批量大小可能会导致模型训练过程中收敛速度变慢。
· 迭代次数(Epoch):迭代次数是指模型在训练数据集上完整迭代一次所需要的次数。它直接影响到模型训练的时间和效果,通常需要根据具体任务进行调整。较小的迭代次数可能会导致模型欠拟合,而较大的迭代次数可能会导致模型过拟合。
· 隐藏层大小(Hidden Size):隐藏层大小是指模型中隐藏层神经元的数量。它直接影响到模型的表达能力,通常需要根据具体任务进行调整。较小的隐藏层大小可能会导致模型欠拟合,而较大的隐藏层大小可能会导致模型过拟合。
· 正则化系数(Regularization Coefficient):正则化系数是指在模型训练过程中用于防止过拟合的系数。它可以通过添加惩罚项来限制模型的复杂度,通常需要根据具体任务进行调整。较小的正则化系数可能会导致模型欠拟合,而较大的正则化系数可能会导致模型过拟合。
· 优化器(Optimizer):优化器是指用于模型训练过程中更新模型参数的算法。常用的优化器有随机梯度下降(SGD)、Adam、Adagrad 等。不同的优化器可能会对模型训练过程产生不同的影响,需要根据具体任务进行调整。
· 激活函数(Activation Function):激活函数是指模型中引入非线性因素的函数。常用的激活函数有 Sigmoid、ReLU、Tanh 等。不同的激活函数可能会对模型训练过程产生不同的影响,需要根据具体任务进行调整。
· 损失函数(Loss Function):损失函数是指模型在训练过程中用于评估模型预测结果与真实标签之间差异的函数。常用的损失函数有均方误差(MSE)、交叉熵损失(Cross-Entropy Loss)等。不同的损失函数可能会对模型训练过程产生不同的影响,需要根据具体任务进行调整。
· 评价指标(Evaluation Metric):评价指标是指模型在训练过程中用于评估模型性能的指标。常用的评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)等。不同的评价指标可能会对模型训练过程产生不同的影响,需要根据具体任务进行调整。
· 学习率调整策略(Learning Rate Scheduler):学习率调整策略是指在模型训练过程中动态调整学习率的方法。常用的学习率调整策略有固定学习率、逐步衰减学习率、余弦退火学习率等。不同的学习率调整策略可能会对模型训练过程产生不同的影响,需要根据具体任务进行调整。
模型数据集的上传与下载
这里以 modelscope 为例
下载:
from modelscope import snapshot_download
download_dir = 'f:/modelscope'
model_dir = snapshot_download('unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit', cache_dir=download_dir)
print(f'Model downloaded to: {model_dir}')
modelscope download
--model Qwen/Qwen2.5-7B-Instruct
--cache_dir /root/autodl-tmp/models
上传:
from modelscope.hub.api import HubApi
YOUR_ACCESS_TOKEN = 'YOUR-MODELSCOPE-TOKEN'
api = HubApi()
api.login(YOUR_ACCESS_TOKEN)
owner_name = 'owner'
model_name = 'awesome-new-model'
model_id = f"{owner_name}/{model_name}"
api.upload_folder(
repo_id=f"{owner_name}/{model_name}",
folder_path='C:\\Users\\31968\\Downloads\\Compressed\\wsj0',
commit_message='upload dataset folder to repo',
repo_type='dataset'
)
modelscope upload owner/awesome-new-model /path/to/model_folder
--token YOUR-MODELSCOPE-TOKEN
--repo-type model
--commit-message 'init'
--commit-description 'my first commit'
后台挂载
nohup python train_wsj0mix.py hparams/WSJ0Mix/dpmamba_M.yaml \
--data_folder /home/wym/wsj0-mix/2speakers \
--dynamic_mixing True \
--base_folder_dm /home/wym/wsj0/si_tr_s \
--precision bf16 > training_output.log 2>&1 &
大模型发展史中一些著名框架的整理:
- Transformer 2017 https://github.com/huggingface/transformers
- BERT 2018 https://github.com/google-research/bert
- GPT-2 2019 https://github.com/openai/gpt-2
- ViT 2021 https://github.com/google-research/vision_transformer
- Mamba 2023 https://github.com/state-spaces/mamba
- ResNet 2015 https://github.com/KaimingHe/deep-residual-networks
- CLIP 2021 https://github.com/openai/CLIP
2025-07-03
在这里想记录一下个人在用轻量配置k8s时遇到的一些问题以及常用指令
首先 推荐部署集群的情况 同一服务商 同一地域 内网环境下 小资源分散
如果只是拥有多台小鸡 不同地域 不同服务商 使用公网ip通信 只是为了方便统一管理 那就完全没有必要部署集群 浪费算力罢了
因为上述的情况 需要额外考虑 长连接优化 API Server代理 等等 只适合用作边缘工作节点
企业级k8s集群会包含的一些组件:
- 网络服务:dns解析 网关管理 流量控制 负载均衡
- 储存服务:定时快照备份 内网镜像存储
- 监控服务:守护进程 监控 告警 日志
- 安全服务:防火墙配置 入侵检测
- 权限服务:统一访问身份认证 证书管理 容器签名
- 运维服务:弹性调度 自动伸缩 滚动升级 故障恢复 服务网格
- 工具服务:可视化管理 时间同步 CI/CD 应用商店
等等等等
能通过面板进行可视化统一管理 当然就部署面板 其中 KubeSphere 使用范围较广 优先推荐通过这个来进行管理
文档地址:https://kubesphere.io/zh/docs/v4.1/
SaaS Software as a Service 软件即服务
特点:按需订阅 集中部署 高可用与弹性扩展 多租户支持 etc.
SaaS 是一种软件交付模型,Kubernetes 是一种容器编排平台;SaaS 提供商可以使用 Kubernetes 来高效部署、管理和扩展他们的服务,支持多租户和弹性伸缩等核心场景。
2025-07-13
想记录一下暑研人工智能医学图像分割中遇到的一个认可度高的图卷积神经网络框架 nnUNet
Repo Url: https://github.com/MIC-DKFZ/nnUNet
DeepWiki: https://deepwiki.com/MIC-DKFZ/nnUNet
向 U-Mamba nnWNet 等 UNet 变体 都用到了该框架
- 编码器(Encoder)
通常使用下采样操作(如卷积 + 池化),逐层提取高维语义特征。 在3D U-Net中,使用的是 3D 卷积,处理体积图像(如CT、MRI数据)。
- 解码器(Decoder)
使用上采样操作(如转置卷积)将特征分辨率逐步恢复。 同时利用 skip connections(跳跃连接)融合编码器中的浅层信息,保留空间细节。
- Bottleneck(中间连接部分)
编码与解码之间的最深部分,通常进行一些处理(卷积+激活函数等),决定高层语义信息。
- 跳跃连接(Skip Connections)
将编码器中的浅层特征与解码器中对应级别的上采样特征进行拼接。 帮助保持空间信息并缓解梯度消失的问题。
U-Mamba 结合了卷积层和状态空间模型(SSM)的优点,能够同时捕获局部特征并聚合长距离依赖性,优于现有的基于CNN和Transformer的分割网络
① 使用背景(Accroding to Repo Readme)
图像数据集具有极大的多样性
- 图像维度(2D、3D)
- 模态/输入通道(RGB图像、CT、MRI、显微镜图像等)
- 图像尺寸、体素尺寸
- 类别比例、目标结构特性等方面在不同数据集中差别显著。
传统上,面对一个新的问题,需要手动设计和优化定制的解决方案——这一过程容易出错、难以扩展,且其成功在很大程度上取决于实验者的技能。 不仅需要考虑众多的设计选择和数据属性,而且它们之间还紧密关联,使得可靠的手动流程优化几乎不可能实现。
而 nnU-Net 是一种语义分割方法,能够自动适应给定的数据集。它将分析提供的训练案例,并自动配置一个匹配的基于 U-Net 的分割流程。
只需将你的数据集转换为nnU-Net格式,非常适合用于大模型的图像分割、训练领域大模型
鲁棒性的意思是:面对干扰和不确定性时仍然稳定可靠
② 如何工作
为每个数据集创建几种U-Net配置:
- 2d:一个2D U-Net(适用于2D和3D数据集)
- 3d_fullres:一个在高图像分辨率上运行的3D U-Net(仅用于3D数据集)
- 3d_lowres → 3d_cascade_fullres:一个3D U-Net级联,其中第一个3D U-Net在低分辨率图像上运行,然后第二个高分辨率3D U-Net优化前者的预测结果(仅用于具有大图像尺寸的3D数据集)
③ 数据结构
TaskXXX_TaskName/
├── dataset.json # 包含类别标签、模态等元数据
├── imagesTr/ # 训练图像(命名需含患者ID,如patient001_0000.nii.gz)
├── labelsTr/ # 训练标签
└── imagesTs/ # 测试图像(可选)
imagesTs
├── la_001_0000.nii.gz
├── la_002_0000.nii.gz
├── la_006_0000.nii.gz
├── ...
dataset.json 格式
{
"channel_names": { # formerly modalities
"0": "T2",
"1": "ADC"
},
"labels": { # THIS IS DIFFERENT NOW!
"background": 0,
"PZ": 1,
"TZ": 2
},
"numTraining": 32,
"file_ending": ".nii.gz"
"overwrite_image_reader_writer": "SimpleITKIO" # optional! If not provided nnU-Net will automatically determine the ReaderWriter
}
推理所使用的数据格式必须与原始数据所使用的格式一致。文件名必须以唯一的标识符开头,然后是一个4位数的模态标识符。
nnUNet_preprocessed 预处理完的数据集
nnUNet_raw 原始数据集
nnUNet_results 模型训练结果
④ 使用命令
MSD 即 Medical Segmentation Decathlon 医学影像分割领域的公共数据集
数据处理相关
nnUNetv2_convert_MSD_dataset -i RAW_FOLDER
nnUNetv2_convert_old_nnUNet_dataset OLD_FOLDER
nnUNetv2_plan_and_preprocess -d DATASET_ID --verify_dataset_integrity
训练模型
nnUNetv2_train DATASET_NAME_OR_ID UNET_CONFIGURATION FOLD --val --npz
nnUNetv2_find_best_configuration DATASET_NAME_OR_ID -c CONFIGURATIONS
五折交叉验证是一种常用的交叉验证方法,属于机器学习中评估模型泛化能力的技术。在五折交叉验证中,数据集被划分为五个互不重叠的子集(也称为“折”或“ folds”)。模型会进行五轮训练和测试:每一轮选择不同的子集作为测试集,其余四个子集合并用作训练集。
参数名 | 含义说明 |
---|---|
dataset_name_or_id |
指定训练所用的数据集名称或 ID(例如:Task001_BrainTumour 或 1 ) |
configuration |
指定训练配置,例如 3d_fullres 、2d 、3d_lowres 、3d_cascade_fullres 等 |
fold |
指定交叉验证的折(fold),值为 0 到 4 之间的整数(支持 5 折交叉验证) |
推理与后处理
nnUNetv2_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -d DATASET_NAME_OR_ID -c CONFIGURATION --save_probabilities
类别 | 目的 | 关键命令 |
---|---|---|
数据集准备 | 处理原始数据集 | nnUNetv2_extract_fingerprint , nnUNetv2_convert_MSD_dataset |
实验规划 | 配置训练参数 | nnUNetv2_plan_experiment |
数据预处理 | 为训练准备数据 | nnUNetv2_preprocess |
综合准备 | 执行所有准备步骤 | nnUNetv2_plan_and_preprocess |
模型训练 | 训练分割模型 | nnUNetv2_train |
推理预测 | 运行预测任务 | nnUNetv2_predict , nnUNetv2_predict_from_modelfolder |
模型集成 | 组合多个模型的预测结果 | nnUNetv2_ensemble |
模型评估 | 评估模型性能 | nnUNetv2_find_best_configuration , nnUNetv2_evaluate_folder |
模型管理 | 共享和复用模型 | nnUNetv2_export_model_to_zip , nnUNetv2_download_pretrained_model_by_url |
工具与实用程序 | 可视化和辅助工具 | nnUNetv2_plot_overlay_pngs |
2025-07-20
这篇思考就主要记录暑研人工智能在语音分离中遇到的一个使用范围较广的一体化语音工具包和语音研究平台
Repo Url: https://github.com/speechbrain/speechbrain
DeepWiki: https://deepwiki.com/speechbrain/speechbrain
Mamba-Transnet ClearerVoice的模型训练中用到了该工具包
一些语音指标:SZDAx 信噪比(SNR) 语音质量感知评估(PESQ) 短时客观可懂度(STOI) 深度降噪平均意见得分(DNSMOS) 尺度不变信噪比(SI-SDR) 以及更多质量基准
① 使用背景(Accroding to Repo Readme)
语音处理和自然语言处理(NLP)等领域如今已变得非常接近,是时候推出一个整体工具包了,它模仿人脑的功能,统一支持构建复杂的对话式AI系统所需的多种技术。涵盖了语音识别、说话人识别、语音增强、语音分离、语言建模、对话以及更广泛的领域。
包含的一些工具