首页
关于
Search
1
Win10/win11 专业版 激活密钥(注册码)
915 阅读
2
欢迎使用 Typecho
738 阅读
3
SeuratData数据集-包含了各种常用的公共数据
387 阅读
4
如何恢复状态
261 阅读
5
读后感11-17
238 阅读
默认分类
想做的事
Python
读后感
日记
随笔
音乐盒
Kali
视频
番茄钟
登录
Search
连祈
累计撰写
85
篇文章
累计收到
13
条评论
首页
栏目
默认分类
想做的事
Python
读后感
日记
随笔
音乐盒
Kali
视频
番茄钟
页面
关于
搜索到
71
篇与
的结果
2025-07-15
Hyper-V 虚拟机显卡直通 VGPU 配置指北 (转载)
转载来源 转载来源2 我已将1650改为3090测试如何在 Hyper-V 虚拟机中配置虚拟 GPU(VGPU)直通,使用 NVIDIA 显卡实现 GPU 加速。以下是详细的配置步骤和注意事项,基于 NVIDIA GeForce GTX 3090测试环境。前提条件硬件要求 :显卡:NVIDIA 显卡,支持 NVENC 功能。本文以 NVIDIA GeForce GTX 3090为例。驱动:显卡驱动的 WDDM 版本需大于 2.4。测试环境中使用 WDDM 2.7(可通过 dxdiag 的“显示”页面查看)。系统要求 :主机运行 Windows 10/11 专业版或企业版,支持 Hyper-V。提前安装好win10或win11虚拟机且处于关闭状态以进行配置。工具准备 :PowerShell(建议以管理员权限运行)。NVIDIA 显卡驱动已正确安装在宿主机上。#核心出装 # 定义虚拟机名称,需要改成你自己的 $vm = "win10" # 设置虚拟机的自动停止操作为关闭(TurnOff) Set-VM -Name $vm -AutomaticStopAction TurnOff # 移除现有的 GPU 分区适配器(若存在),确保从干净状态开始 Get-VMGpuPartitionAdapter -VMName $vm | Remove-VMGpuPartitionAdapter # 添加新的 GPU 分区适配器 Add-VMGpuPartitionAdapter -VMName $vm # 启用 GuestControlledCacheTypes,优化性能 Set-VM -GuestControlledCacheTypes $true -VMName $vm # 设置低内存映射 I/O 空间为 1GB Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm # 设置高内存映射 I/O 空间为 32GB Set-VM -HighMemoryMappedIoSpace 32Gb -VMName $vm # 可选 # 设置 GPU 资源分配:显存(VRAM)、编码(Encode)、解码(Decode)、计算(Compute) # 最小 1%,最大 70%,最佳 50% Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 1 -MaxPartitionVRAM 90 -OptimalPartitionVRAM 50 Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionEncode 1 -MaxPartitionEncode 90 -OptimalPartitionEncode 50 Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionDecode 1 -MaxPartitionDecode 90 -OptimalPartitionDecode 50 Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionCompute 1 -MaxPartitionCompute 90 -OptimalPartitionCompute 50配置显卡驱动目前虚拟机的 GPU 还处于不可用状态,需要在虚拟机中安装与主机匹配的 NVIDIA 驱动文件。宿主机驱动文件路径: 主机上的 NVIDIA 驱动文件通常位于 :C:\Windows\System32\DriverStore\FileRepository\查找以 nv 开头的文件夹,包含 NVIDIA 驱动相关文件。 虚拟机驱动文件路径 :在虚拟机的 C:\Windows\System32\ 下手动创建文件夹:C:\Windows\System32\HostDriverStore\FileRepository\具体查找方法为:设备管理器-> Nvidia 3090 -> 驱动程序详细信息 -> 拉到最下面看最后一行的第一段路径将第一步的 NV 开头文件夹复制到第二步创建的目录里 复制 NVIDIA API 文件:将宿主机上的 nvapi64.dll 文件复制到虚拟机的相同路径:C:\Windows\System32\nvapi64.dll重启虚拟机在虚拟机设备管理器查看驱动状态,黄色叹号已经消失了就代表可用
2025年07月15日
6 阅读
0 评论
0 点赞
2025-06-30
通过H5文件构造Dataset满足Dataloader多进程读取需求
使用Dataloader需要构建Dataset,dataset需要满足以下基本要求 class MyDataset(Dataset): def __init__(self,): # 初始化:加载所有样本路径、标签、预处理等 pass def __len__(self): # 返回数据集大小:Dataset 必须支持 len(dataset) return N def __getitem__(self, idx): # 根据索引返回一个样本,idx ∈ [0, N) # 通常返回 (data, label);也可以返回 dict、tuple 等任意容器 return sampleh5py多线程读取 并不能真正并行 ,HDF5 库内部对所有 API 调用加了一把全局互斥锁,对同一个文件的读写实际上仍会被串行化,无法获得并行加速。。因此应使用多进程读取要注意的是不要在父进程打开文件后再 fork。也就是在__init__阶段读取基本信息后关闭文件(使用with操作),等init结束后( Linux 下是通过 fork 复制主进程,此阶段结束后)再重新打开文件,否则所有子进程都会继承同一个文件描述符(FD)和内部的 HDF5 状态。这种跨进程共享同一 FD,在底层 HDF5 C 库看来就像是多个线程同时操作同一个连接,会触发其全局锁。为了避免反复打开关闭h5文件,Dataloader场景下,会在__getitem__中打开一次然后复用self._h5_file = h5py.File(self.h5_path, 'r')因此需要回收资源def __del__(self): # 确保关闭文件句柄,避免资源泄露 try: if self._h5_file is not None: self._h5_file.close() except Exception: pass可以定义多个Dataset,然后通过ConcatDataset连接起来from torch.utils.data import ConcatDataset dataset = ConcatDataset([H5Dataset(p) for p in h5_paths])示例代码class MultiH5Dataset(torch.utils.data.Dataset): def __init__(self, h5_paths): self.paths = h5_paths # 预先读取每个文件的样本数,构建全局索引映射 self.cum_counts = [] total = 0 for p in h5_paths: with h5py.File(p,'r') as f: n = len(f['data']) total += n self.cum_counts.append(total) def __len__(self): return self.cum_counts[-1] def __getitem__(self, idx): # 找到 idx 属于哪一个文件 file_idx = bisect.bisect_right(self.cum_counts, idx) # 计算在该文件内的局部索引 prev = self.cum_counts[file_idx-1] if file_idx>0 else 0 local_idx = idx - prev with h5py.File(self.paths[file_idx],'r') as f: data = f['data'][local_idx] label = f['label'][local_idx] return data, label
2025年06月30日
4 阅读
0 评论
0 点赞
2024-11-05
SSH端口转发的坑
端口转发分为本地端口转发、远程端口转发、动态端口转发、本地端口转发是把远程的端口拿到内部来,感觉没啥用。远程端口转发等效于反向代理,把内网的端口拿到公网去。动态端口转发我暂时还没用到。其中我遇到的问题是 配置了ssh远程端口转发后无法公网访问 后来发现是因为我没在远程主机的ssh设置里打开允许外网访问#/etc/ssh/sshd_config AllowTcpForwarding yes#允许用户通过 SSH 创建 TCP 转发连接,这可以用于实现端口转发。禁用此功能(设置为 no)将阻止任何类型的 TCP 转发,包括本地、远程和动态转发。默认为YES GatewayPorts no#控制是否允许远程主机通过 SSH 连接到转发的端口。默认为no TCPKeepAlive yes#当设置为 yes 时,TCP 会话将在指定时间内发送心跳包,以确保连接处于活动状态。这有助于在网络不稳定时防止连接意外中断。 ClientAliveInterval 60#设置客户端存活检测的间隔时间。该参数指定 SSH 服务器在等待多长时间后向客户端发送存活消息(心跳)。在此示例中,服务器每 60 秒向客户端发送一次请求,以确认客户端仍然在线。 ClientAliveCountMax 1440#设置客户端存活检测的最大失败次数。该参数指定 SSH 服务器在终止连接之前,允许连续未响应的存活消息的最大次数。在此示例中,如果客户端在 1440 次存活消息中未响应,服务器将关闭与客户端的连接。可算把我好一顿折腾。详细参考可见 SSH端口转发SSH 端口转发又称为 SSH 隧道,是通过 SSH 协议建立隧道,实现本地主机和远程主机的端口绑定,数据由 SSH 协议进行加密传输。SSH 有三种端口转发模式:本地端口转发(Local port forwarding);远程端口转发(Remote port forwarding);动态端口转发;本文介绍 SSH 的这三种端口转发和持久化工具 autossh。本地端口转发SSH 绑定本地端口,将本地端口的访问转发到远端。使用 -L 参数,格式为 本地端口:目标主机:目标主机端口。假设本地主机为 host1,host1 能够访问 host2, host2 能够访问 host3,但 host1 无法直接访问 host3。在 host1 上执行:ssh -L 8888:host3:8000 host2表示绑定本地 8888 端口,该端口的访问流量会由 host2 转发至 host3:8000 端口。在 host1 上执行:1ssh -L 8888:localhost:8000 host2表示绑定本地 8888 端口,该端口的访问流量会转发至 host2:8000 端口。注意目标主机的 localhost 指的是目标主机本身。本地端口默认绑定到 localhost,只能本地访问,若要可以外网访问(绑定 0.0.0.0),可以写成:ssh -L :8888:host3:8000 host2远程端口转发SSH 绑定远程端口,将远程端口的访问转发到本地。使用 -R 参数,格式为 远程主机端口:目标主机:目标主机端口。SSH 远程端口转发非常适合用来做内网穿透。假如 host1 是公网主机,host2 是内网主机且能够访问公网,host3 是内网主机不能访问公网,但 host2 可以访问 host3。如果要从 host1 访问 host3,可以用 host2 中转。在 host2 上执行:ssh -R 8888:host3:8000 host1表示绑定 host1 的 8888 端口,该端口的访问流量会由 host2 转发至 host3:8000 端口。在 host2 上执行:ssh -R 8888:localhost:8000 host1表示绑定 host1 的 8888 端口,该端口的访问流量会转发至 host2:8000 端口,注意目标主机的 localhost 指的是本地主机(发起 SSH 连接的主机)。远程端口也是默认绑定到 localhost,若要外网访问(绑定 0.0.0.0),需要修改远程主机的 /etc/ssh/sshd_config 配置:GatewayPorts yes记得重启 sshd 服务:systemctl restart sshd动态端口转发上述两种端口转发都是固定端口对固定端口的转发。动态端口转发不必指定端口号,可以将本地任意端口的流量转发到 SSH 远端。动态端口转发使用 -D 参数,参数为 绑定地址:绑定本地端口。SSH 会启动一个 SOCKS 服务器监听该地址和端口,当使用该端口作为 SOCKS 代理时,请求的流量会被转发到远端。例如在 host1 上执行ssh -D 8000 host2则在 host1 的 Firefox 中指定 localhost:8000 作为 socks 代理时,可以直接访问 host2 能够访问的主机和端口。SSH 的其他参数-N 只连接远程主机,不打开远程 shell;-T 不为这个连接分配 TTY;这两个参数可以一起使用,代表这个 SSH 连接只用来传输数据,不执行远程操作。-f 表示 SSH 连接成功后,转入后台运行。autosshSSH 连接可能会意外断开或 hang 住,用进程监控工具,并不能有效检测到 hang 住的情况,autossh 就是为了解决这个问题。autossh 会启动一个 SSH 进程,并实现一个端口转发循环,当发现进程死掉或者端口转发循环的流量停止时,会重启 SSH 进程,有效避免了 hang 住导致 SSH 端口转发不可用的情况。安装:sudo apt install autosshautossh 命令的参数除了 -M 参数(用于手动指定端口转发循环的端口)外,其他参数与 ssh 命令相同,并会把这些参数传递给监视的 SSH 进程。所以一个稳定的 SSH 远程端口转发的命令可以是:sh -NT -R 8888:localhost:8000 host1可以将 autossh 与 supervisor 等进程管理工具配合使用,建立长期稳定的 SSH 端口转发。
2024年11月05日
179 阅读
0 评论
0 点赞
2024-11-04
Docker的三种代理设置方式
Docker的三种网络代理配置有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理。 Docker的代理配置,略显复杂,因为有三种场景。 但基本原理都是一致的,都是利用Linux的http_proxy等环境变量。dockerd代理 在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置。sudo mkdir -p /etc/systemd/system/docker.service.dsudo touch /etc/systemd/system/docker.service.d/proxy.conf在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:[Service]Environment="HTTP_PROXY=http://proxy.example.com:8080/"Environment="HTTPS_PROXY=http://proxy.example.com:8080/"Environment="NO_PROXY=localhost,127.0.0.1,.example.com"其中,proxy.example.com:8080要换成可用的免密代理。 通常使用cntlm在本机自建免密代理,去对接公司的代理。 可参考《Linux下安装配置Cntlm代理》。Container代理 ¶在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json。 以下配置,只在Docker 17.07及以上版本生效。{ "proxies": { "default": { "httpProxy": "http://proxy.example.com:8080", "httpsProxy": "http://proxy.example.com:8080", "noProxy": "localhost,127.0.0.1,.example.com"} }}这个是用户级的配置,除了proxies,docker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。 这两种方法分别适合不同场景。 config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。 在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。docker build代理 ¶虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。docker build . \--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \ --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \ --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \ -t your/image:tag 注意:无论是docker run还是docker build,默认是网络隔绝的。 如果代理使用的是localhost:3128这类,则会无效。 这类仅限本地的代理,必须加上--network host才能正常使用。 而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。重启生效 ¶代理配置完成后,reboot重启当然可以生效,但不重启也行。docker build代理是在执行前设置的,所以修改后,下次执行立即生效。 Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。dockerd代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启dockerd才能生效。sudo systemctl daemon-reloadsudo systemctl restart docker参考 https://note.qidong.name/2020/05/docker-proxy/
2024年11月04日
18 阅读
0 评论
0 点赞
2024-11-04
Nginx转发设置模板
#80 server { listen 80; # server_name your_domain.com; # 替换为你的域名或 IP 地址 return 301 https://$host$request_uri; location / { proxy_pass http://localhost:10; # 转发到 18000 端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } #443 server { listen 443 ssl; # server_name your_domain.com; # 替换为你的域名或 IP 地址 ssl_certificate /path/to/your/certificate.crt; # 替换为你的 SSL 证书路径 ssl_certificate_key /path/to/your/private.key; # 替换为你的 SSL 私钥路径 location / { proxy_pass https://localhost:14; # 转发到 14430 端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
2024年11月04日
14 阅读
0 评论
0 点赞
1
2
...
15