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_BrainTumour1
configuration 指定训练配置,例如 3d_fullres2d3d_lowres3d_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系统所需的多种技术。涵盖了语音识别、说话人识别、语音增强、语音分离、语言建模、对话以及更广泛的领域。

包含的一些工具

results matching ""

    No results matching ""