利用 frp 进行内网 ssh
在企业网络环境中,通过跳板机访问内网或 WSL2 主机时,SSH 经常出现不稳定问题,例如连接卡在 SSH2_MSG_KEX_ECDH_REPLY,或在连接成功后出现 vim/tmux 显示不完整、会话假死等现象。 这类问题本质上与网络路径、MTU、TCP 长连接稳定性有关,单纯依赖 ssh 或 autossh 很难彻底解决。 目标 实现如下访问路径: MacBook → 公网服务器 → 内网机器 / WSL2 在 MacBook 上通过 SSH 连接公网服务器的某个端口,即可稳定访问内网主机的 SSH 服务。 服务端(公网服务器) 下载并启动 frps: wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz tar xf frp_0.53.2_linux_amd64.tar.gz cd frp_0.53.2_linux_amd64 创建最小配置: # frps.ini [common] bind_port = 7000 启动服务: ./frps -c frps.ini 确保云防火墙放行 7000 端口。 客户端(内网机器 / WSL2) 下载 frpc 并配置反向 SSH 通道: wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz tar xf frp_0.53.2_linux_amd64.tar.gz cd frp_0.53.2_linux_amd64 # frpc.ini [common] server_addr = 公网服务器IP server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 2222 启动客户端: ...
WSL2 ssh 卡在 KEX_ECDH_REPLY
在 WSL2(Ubuntu 22.04) 中,通过 ssh 连接远端服务器时,连接会无响应。执行调试命令: ssh -vvv user@host 可以看到输出停在: expecting SSH2_MSG_KEX_ECDH_REPLY 客户端不再继续,服务器侧也没有任何日志。更换网络或在 Windows 原生终端中连接正常,说明并非服务器或账号问题。 搜索该现象后,定位到 Unix StackExchange 上的一篇帖子,指出这是 SSH 在 密钥交换阶段(KEX) 发送的握手包过大,在某些网络(WSL2 NAT、防火墙、VPN、校园/公司网络)中触发 Path MTU 黑洞,导致服务器无法收到 KEX_ECDH_INIT,因此不会返回 SSH2_MSG_KEX_ECDH_REPLY。 按照帖子中的建议,手动指定较短的密钥交换算法测试: ssh -o KexAlgorithms=ecdh-sha2-nistp521 user@host 连接立即成功,确认问题与网络路径和握手包大小有关。 为避免每次手动指定参数,将配置写入用户级 SSH 配置文件: ~/.ssh/config 内容如下: Host my-server HostName real.server.ip.or.domain User myuser KexAlgorithms ecdh-sha2-nistp521 此后使用 ssh my-server 即可正常连接,问题稳定解决。
自托管 Github Actions Runner
在 Linux 系统上,依次执行以下步骤 mkdir actions-runner && cd actions-runner curl -o actions-runner-linux-x64-2.329.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.329.0/actions-runner-linux-x64-2.329.0.tar.gz tar xzf ./actions-runner-linux-x64-2.329.0.tar.gz 然后来到你的仓库 -> settings -> actions -> runners -> Add your self-hosted 可以看到 Configure 部分的指令,执行它们进行登录。会让你输入一些名称之类的,本次教程全部回车,根据自己需要配置 然后我们安装服务 sudo ./svc.sh install sudo ./svc.sh start 这样 runner 就会作为服务在后台
如何为 github actions 创建专用用户
这是为了赋予该用户某些高权限操作,且不会赋予太多权限,保证服务器安全 # 1. 创建用户(无密码,避免本地密码登录) sudo adduser --disabled-password --gecos "" ghactions # 2. 创建 .ssh 目录 sudo mkdir -p /home/ghactions/.ssh # 3. 权限收紧 sudo chown -R ghactions:ghactions /home/ghactions/.ssh sudo chmod 700 /home/ghactions/.ssh 然后为 github actions 创建私钥用于github action 远程登录 # 切换至用户 sudo su ghactions # 生成公私钥 ssh-keygen -t ed25519 -C "github-actions" -f ~/.ssh/id_ed25519 # 查看公钥,复制到剪贴板: cat ~/.ssh/id_ed25519.pub # 切换回原用户 su <原用户名> # 执行赋予权限 sudo bash -c 'echo "这里换成你的公钥内容" >> /home/ghactions/.ssh/authorized_keys' sudo chown ghactions:ghactions /home/ghactions/.ssh/authorized_keys sudo chmod 600 /home/ghactions/.ssh/authorized_keys 为 ghactions 赋予特定操作的权限 ...
常用 docker 镜像命令速查
postgres docker run -d --name postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres -p 5432:5432 -v pgdata:/var/lib/postgresql/data postgres:16 pgvector docker run -d \ --name pgvector-db \ -e POSTGRES_PASSWORD=mysecret \ -p 5432:5432 \ pgvector/pgvector:pg16
Obsidian Git 同步
在 obsidian 设置中点击第三方插件,搜索插件 git 然后通过终端进入你的 obsidian 笔记所在目录,初始化一个 git 仓库 然后其实和正常 git 一样,你需要和远程 github 仓库关联。此处不赘述 然后,在插件中开启 也可以根据自己需要修改其他的
哈工大人工智能实验 MNIST 预测
代码获取请单击此处 HIT_AI_Intro_Exp 快速开始 1. 数据集准备 我们从网络上下载 MNIST_data 数据集,解压后放在文件夹下,可以看到分为训练集和测试集两部分 2. 训练模型 首先,你需要在电脑上安装 uv 工具(如果你熟悉 conda 也可以)。uv 安装随便去网上搜搜教程就行 拥有 uv 后,请你运行 uv --version 如果显示了版本则说明 uv 正常安装了 然后运行以下命令,安装所需要的 Python 包(如果你用过 conda 就是安装 requirenments.txt 里面的包,请使用 python 3.10) uv sync 我们安装的是以下包,最重要的是 mindspore 训练框架 然后训练我们的模型。命令为 uv run train.py --ckpt_path ./ckpt 可以看到训练开始了,显示每一轮以及损失 最终我们看到ckpt/下有一系列检查点,这些也就是我们训练得到的模。,最后一个 4-10 也就是第 10 个 epoch 得到的模型,最完整的模型 3. 评估模型 我们使用最后一个 checkpoint 得到的模型来使用 test 数据集进行评估 uv run eval.py --ckpt_path ckpt/checkpoint_lenet_4-10_1875.ckpt 运行如下图 可以看到精度 98.88%,还是很不错的。接下来我们将使用图片真实的从使用角度测试该模型 ...
使用 MLX 在 Apple M 芯片进行 Lora 微调
苹果加油,和 CUDA 碰一碰 数据准备 从 github 克隆 Apple 给出的示例项目项目 git clone https://github.com/ml-explore/mlx-examples.git 在项目lora/data/中放置你的训练、验证和测试集数据 下载一个模型。此处我们从modelscope下载一个小模型minimind2 pip install modelscope modelscope download --model gongjy/MiniMind2 下载后,记住模型的路径。此处我的路径如下 环境配置 使用 uv 初始化一个环境 $ uv init --name mlx . -p3.13 Initialized project `hypollm` at `/Users/dorian/Documents/Programme/NUS311/model_test` 你也可以使用conda $ conda create -n mlx python==3.13 安装所需的包 $ uv add mlx-lm transformers torch numpy 微调过程 进入项目路径 cd /mlx_example/lora/。如果不使用 swanlab 就删除最后一个 arg $ mlx_lm.lora --model <此处你的基座模型路径> --train --data ./data --report-to swanlab # 显示如下则成功 # Loading pretrained model # Loading datasets # Training # Trainable parameters: 1.654% (1.720M/104.031M) # Starting training..., iters: 1000 # Calculating loss...: 100%|██| 25/25 [00:07<00:00, 3.42it/s] 微调结束后,可以看到如下内容,是 checkpoints 和最终模型 然后我们进行融合权重 $ mlx_lm.fuse --model <你的基座模型路径> --adapter-path adapters --save-path <你的模型名字> 最终得到以下文件 模型部署 下载 Ollama(麻烦自行查找并下载) 新建一个Modelfile,注意没有后缀,内容如下(也可以参考此网站) FROM <模型文件夹的绝对路径> # 推理参数(适合精确结构推理) PARAMETER temperature 0.2 PARAMETER top_p 0.8 PARAMETER top_k 50 PARAMETER repeat_penalty 1.05 PARAMETER num_ctx 4096 PARAMETER num_predict 512 # 对齐 Qwen 格式的多轮对话模版 TEMPLATE """<|im_start|>system {{ .System }}<|im_end|> <|im_start|>user {{ .Prompt }}<|im_end|> <|im_start|>assistant """ # 设定系统指令 SYSTEM "You are an expert in causal inference and graph theory." 利用 ollama 创建 $ ollama create <模型名字> -f <Modelfile位置> 运行 $ ollama run <模型名字> 这篇博客也很好 https://juejin.cn/post/7426343844595335168
模型训练踩坑合集
确定模型层数 python -c "import torch; ckpt = torch.load('full_sft_512.pth', map_location='cpu'); print('模型键:', ckpt.keys() if isinstance(ckpt, dict) else 'direct tensor'); print('\n层数统计:'); [print(k) for k in (ckpt.keys() if isinstance(ckpt, dict) else [])]" 50 系显卡 cuda 和 pytorch 不兼容问题,升级到最新 cu129 pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu129
Flutter 学习笔记
本笔记基于该教程, 让我们说谢谢 Google 写着感觉和 ArkTS 和 Kotlin 很像 PS:如果你使用 Windows,请将所有 ⌘ (Mac 上的 Command 键)视为 Ctrl 键 Flutter环境配置 按照 flutter brew install flutter 安装 VSCode(其他的也行)插件 安装 xcode xcode-select --install 创建一个新项目 F1 -> flutter new -> Application->填项目名称,选路径 替换以下内容 pubspec.yaml name: 你的项目名称 description: A new Flutter project. publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: sdk: '>=2.19.4 <4.0.0' dependencies: flutter: sdk: flutter english_words: ^4.0.0 provider: ^6.0.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 flutter: uses-material-design: true 替换 analysis_options.yaml (用于代码分析器) include: package:flutter_lints/flutter.yaml linter: rules: prefer_const_constructors: false prefer_final_fields: false use_key_in_widget_constructors: false prefer_const_literals_to_create_immutables: false prefer_const_constructors_in_immutables: false avoid_print: false 替换lib/main.dart,经典的面向对象语言 import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (context) => MyAppState(), child: MaterialApp( title: 'Namer App', theme: ThemeData( useMaterial3: true, colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), ), home: MyHomePage(), ), ); } } class MyAppState extends ChangeNotifier { var current = WordPair.random(); } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { var appState = context.watch<MyAppState>(); return Scaffold( body: Column( children: [ Text('A random idea:'), Text(appState.current.asLowerCase), ], ), ); } } 运行这个新项目 停留在 main.dart 上,选择当前的目标运行平台(右下角) 我这里选了 Mac,然后点击运行标志,结果报错了在 stackoverflow 找到xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH。如果装了 Xcode APP 版本,进入 Settings->Locations,改一下 command line tools 的路径 再运行,还是报错 运行 flutter doctor -v,发现没装 cocoapods。运行brew install cocoapods即可 再运行,还是一样的报错。在这里找到原因,有人就是因为被 iCloud 文件提供器加了 com.apple.fileprovider.fpfs#P 才一直失败,- 任何打包进 .app 的文件只要带有资源分叉或 Finder 信息,CodeSign 都会拒绝。所以我把项目移出了 iCloud 同步的文件夹,然后清理资源重新运行 # 1) Flutter 清理 + 移除构建输出 flutter clean rm -rf build/macos # 2) 删除 Xcode 派生数据 rm -rf ~/Library/Developer/Xcode/DerivedData/* # 3) 递归清理整个项目树的扩展属性(包含将来要进 .app 的一切) xattr -rc . # 4) 若你从网上下过三方二进制/压缩包,顺便去掉隔离标记 xattr -dr com.apple.quarantine . # 5) 重新预拉取 macOS 引擎构件(避免 SDK 自身产物带脏属性) flutter precache --macos # 6) 重新构建 flutter run -d macos 这次成功了,弹出了我们的 APP 再试试 iOS 平台,右下角构建平台选择 ios simulator再打开 lib/main.dart ,点击右上角运行标志,等待一会也可以正确显示 热重载 我们修改文字,并按 ⌘+S,可看到程序中的文字发生了变化(注意 Web 平台不支持) 添加一个按钮 我们继续修改,修改以下内容 ...