阅读完《动手学深度学习》第二版,深受启发。为了巩固成果,决定动手使用pytorch实现卷积神经网络LeNet,以掌握构建、训练、测试深度学习模型的流程和方法。
环境准备
代码示例
参考链接
- 卷积神经网络(LeNet),by d2l.
阅读完《动手学深度学习》第二版,深受启发。为了巩固成果,决定动手使用pytorch实现卷积神经网络LeNet,以掌握构建、训练、测试深度学习模型的流程和方法。
DIS是美国国防部、北约及其盟国实时/虚拟世界建模与仿真领域应用最广泛的协议之一。Open-DIS 是该标准的免费开源实现,支持 Java、C++、Python、JavaScript、Objective-C 和 C# 等多种编程语言。
DIS 是由仿真互操作性标准组 (SISO) 制定并经 IEEE 批准的 IEEE 标准 (IEEE-1278.1)。它被广泛应用于实时虚拟世界军事仿真中。
DIS 是一种网络协议。它精确描述了数十个协议数据单元 (PDU) 的布局,这些 PDU 包含有关世界中实体位置和方向以及其他诸多信息。这些 PDU 用于描述电子战、后勤、碰撞和仿真管理。
游戏的网络同步机制有很多,总体来看可以分为下面三类:
DIS使用 Peer-to-Peer 方式进行状态的网络同步。
绿联 DX4600 NAS 支持Docker服务,可惜只能在内网使用,必须掌握内网穿透技术,才能在外网访问Docker提供的服务。下面介绍如何在绿联 DX4600 NAS 配置内网穿透的方法。
NAT 是网络地址转换的缩写。它是一种在网络中广泛使用的技术,主要作用是在数据包通过路由器或防火墙时,修改数据包中的源IP地址或目标IP地址。
NAT主要解决以下问题:
NAT常见类型主要有三种:
内网穿透的核心原理,可以通俗地理解为:让没有公网IP的设备,通过一个有公网IP的中转服务器,和外部设备建立数据通道。
其工作流程分为两步:
第一步:建立隧道(内网设备主动连接服务器)
第二步:数据转发(打给服务器,转给内网)
这个过程就是内网穿透的本质:数据全部经过服务器中转。
为了提高速度,更高级的穿透(如P2P模式,即点对点模式)会尝试让两个内网设备直接连接。原理如下:
这就是P2P打洞技术,也是P2P(如BT下载)和视频通话流畅运行的基础。
NAT的不同“性格”(类型)直接决定了打洞的成败。主要有以下四种类型:
| NAT类型 | 工作原理 | 打洞成功率 |
|---|---|---|
| 完全锥型 | 映射关系建立后,任何外部主机都可以通过这个公网端口访问内网主机。 | ✅ 最容易 |
| 受限锥型 | 只有内网主机主动发送过数据的外部主机(不限端口),才能通过公网端口向内网发起通信。 | ✅ 较容易 |
| 端口受限锥型 | 要求更严格,只有内网主机主动发送过数据的特定(IP+端口)组合,才能向内网通信。 | ✅ 有条件 |
| 对称型 | 最严格。每次内网主机向不同目标主机发起连接,NAT都会重新分配一个新的公网端口,导致无法预测对方的“入口”。 | ❌ 基本无效 |
请参考:
目前绿联DX4600提供的Docker镜像仓库均无法下载Docker镜像,可修改使用轩辕镜像下载Docker镜像。
使用cpolar提供的免费内网穿透服务,可实现远程登陆绿联 DX4600 进行操作。
DX4600操作系统是基于OpenWrt系统的,因此安装 cpolar 请参考:
具体步骤如下:
1 | # 下载公钥 |
Transformers是为 PyTorch 打造的先进的机器学习工具。Transformers 充当跨文本、计算机视觉、音频、视频与多模态的最先进机器学习模型的「模型定义框架」,同时覆盖推理与训练。
它将模型的定义集中化,使整个生态系统对该定义达成一致。transformers 是跨框架的枢纽:一旦某模型定义被支持,它通常就能兼容多数训练框架(如 Axolotl、Unsloth、DeepSpeed、FSDP、PyTorch‑Lightning 等)、推理引擎(如 vLLM、SGLang、TGI 等),以及依赖 transformers 模型定义的相关库(如 llama.cpp、mlx 等)。
pip 下载的包太大,需要清除,可使用如下命令查看:
1 | # 查看 pip 下载包缓存位置 |
Transformers 支持 Python 3.9+,以及 PyTorch 2.1+。
使用 venv 或 uv(一个基于 Rust 的快速 Python 包与项目管理器)创建并激活虚拟环境:
1 | # venv |
在虚拟环境中安装 Transformers:
1 | # pip安装 pytorch gpu 版本 |
1 | import torch |
使用 Pipeline API 一步上手。Pipeline 是一个高级推理类,支持文本、音频、视觉与多模态任务,负责输入预处理并返回适配的输出。
实例化一个用于文本生成的 pipeline,指定使用的模型。模型会被下载并缓存,方便复用。最后传入文本作为提示:
1 | from transformers import pipeline |
transformers自动下载模型的保存位置:C:\Users\jack.cache\huggingface\hub\,在模型下载以后,可以保存到其他位置。
由于某些原因,国内的服务器可能无法直接访问huggingface.co。可以通过配置使用其镜像站。例如:hf-mirror.com。
hf-mirror.com是用于镜像 huggingface.co 域名。作为一个公益项目,致力于帮助国内AI开发者快速、稳定的下载模型、数据集。
下面介绍从 hf-mirror.com 下载大模型的方法:
1 | Script\activate |
1 | set HF_ENDPOINT=https://hf-mirror.com |
1 | # 下载大模型默认保存位置:C:\Users\jack\.cache\huggingface\hub\ |
1 | # 自定义数据集保存位置 |
对于银河麒麟桌面版4.0.2,可使用系统已集成的 vino-server 进行远程桌面访问。具体步骤如下:
最近接触到 DDS 中间件,学习一下。
针对实时系统的数据分发服务( DDS )是对象管理组织(OMG)的机器对机器(有时称为中间件或连接框架)标准,旨在通过发布-订阅模式实现可靠、高性能、可互操作、实时、可扩展的 数据交换。
DDS 满足航空航天、国防、空中交通管制、自动驾驶车辆、医疗设备、机器人、发电、仿真和测试、智能电网管理、交通运输系统等 应用领域的实时数据交换需求。
下面从源代码编译安装 Fast-DDS。
使用 vcpkg 安装 Fast-DDS 所需依赖库。
1 | vcpkg install openssl asio tinyxml2 fastcdr foonathan-memory --triplet x64-windows |
在Windows平台编译安装使用 Visual Studio 2019.
FastDDS 依赖 Foonathan Memory(内存管理库),通过源代码编译安装:
1 | cd i:\project\Fast-DDS\ |
FastDDS 依赖 FastCDR(序列化库),通过源代码编译安装:
1 | cd i:\project\Fast-DDS\ |
当所有依赖库都安装后,开始安装eProsima Fast DDS,打开 VS2019的X64本地命令提示符,按如下步骤输入命令:
1 | cd i:\project\Fast-DDS\ |
当执行 cmake -DCMAKE_INSTALL_PREFIX=i:/install/fastdds .. 可能会报找不到 ASIO 的错误,可以编辑 CMakeLists.txt,注释如下代码,再重新运行。
1 | eprosima_find_thirdparty(Asio asio VERSION 1.13.0) |
当执行 cmake –build . –config Release –target install 可能会报如下错误:
1 | 警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 |
请参考以下链接进行处理,主要是配置C++编译选项 /utf-8:
fastddsgen 是 FastDDS 官方提供的 IDL(Interface Definition Language)编译器,用于将 IDL 定义的数据类型转换为 FastDDS 兼容的代码(支持 C++、Python 等语言),自动生成数据序列化 / 反序列化逻辑、类型注册代码等,是 FastDDS 开发的基础工具。
具体安装步骤请参考:
Fast-DDS的简单示例请参考:
阅读书籍《图解大模型:生成式AI原理与实战》,做些笔记。
当使用隐式链接的方法调用 DLL 中的导出函数时,需要代码的头文件、导入库lib和动态链接库。如何缺失导入库lib,将无法使用隐式链接的方式调用 DLL中的函数。幸运的是,通过一些手段可以从DLL中直接生成导入库lib。
步骤如下:
1 | include '..\implib.inc' |
生成DLL导入库lib的方案有很多,最便利的方法是使用 ImpLib SDK 工具。具体教程如下:
1 | \bin\dll2def c:\windows\system32\kernel32.dll kernel32.def |
1 | \bin\fasm kernel32.def kernel32.lib |
最近需要使用C++的多线程编写一个处理程序,因此学习记录一下C++多线程的编程知识。
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
传统的C++(C++11标准之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h> 。
C++11提供了语言层面上的多线程,包含在头文件
中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C++11 新标准中引入了5个头文件来支持多线程编程。
这5个头文件分别是:
创建线程的基本方法如下所示:
1 | # 示例1 |
主线程与子线程的处理方法:
可以使用joinable判断是join模式还是detach模式。
1 | if (myThread.joinable()) foo.join(); |
1 | #include <iostream> // std::cout |
因为程序边运行边创建线程是比较耗时的,所以我们通过池化的思想:在程序开始运行前创建多个线程,这样,程序在运行时,只需要从线程池中拿来用就可以了.大大提高了程序运行效率.一般线程池都会有以下几个部分构成:
1 | #include <iostream> |
最近找了一个 NTP 时间同步工具,使用 GO 语言编写,能够跨平台在 Windows 、 Linux 、 Mac 上运行,挺实用的,但是需要配置 GO 语言环境,于是记录一下过程。
GO 语言环境的安装请参考:
下载 GO 语言相关模块时可能被墙,需要设置代理加速下载,方法如下:
1 | # 执行下面的指令 |