Lixuan's Blog


  • Home

  • Tags

  • Categories

  • Archives

  • links

服务器负载分析指南:CPU与GPU监控

Posted on 2025-04-10 | In 服务器运维 , 性能优化 , 服务器负载分析

前言

在深度学习任务管理中,了解服务器的资源使用情况至关重要。基于服务器的资源的使用情况,能够有效分析程序是CPU使用密集还是GPU使用密集,优化程序运行性能。本文将介绍如何使用top和gpustat命令来监控和分析服务器的CPU和GPU负载情况。

CPU负载分析:使用top命令

基本使用

1
top

top界面解析

  1. 系统信息概览(第1-5行):
  • 第1行:系统运行时间、用户数、负载均衡

    • load average后的三个数字分别表示1分钟、5分钟、15分钟的平均负载
    • 数值不应超过CPU核心数,否则表示系统超负荷
  • 第2行:任务信息

    • total:进程总数
    • running:正在运行的进程数
    • sleeping:睡眠的进程数
    • stopped:停止的进程数
    • zombie:僵尸进程数
  • 第3行:CPU使用率

    • us:用户空间占用CPU百分比
    • sy:内核空间占用CPU百分比
    • ni:用户进程空间内改变过优先级的进程占用CPU百分比
    • id:空闲CPU百分比
    • wa:等待输入输出的CPU时间百分比
  • 第4-5行:内存使用情况

    • Mem:物理内存
    • Swap:交换空间
  1. 进程信息(第7行开始):
  • PID:进程ID
  • USER:进程所有者
  • PR:进程优先级
  • NI:nice值(负值表示高优先级,正值表示低优先级)
  • VIRT:虚拟内存使用量
  • RES:实际物理内存使用量
  • SHR:共享内存大小
  • S:进程状态
  • %CPU:CPU使用率
  • %MEM:内存使用率
  • TIME+:进程使用的CPU时间总计
  • COMMAND:进程名称

常用交互命令

  • P:按CPU使用率排序
  • M:按内存使用率排序
  • T:按运行时间排序
  • k:终止进程(需要输入PID)
  • r:重新设置进程优先级
  • q:退出top

GPU负载分析:使用gpustat

安装gpustat

1
pip install gpustat

基本使用

1
gpustat

输出解析

每个GPU的信息包含:

  • GPU ID:显卡编号
  • 显卡型号
  • 温度信息
  • GPU利用率
  • 显存使用情况:已用/总量
  • 运行在该GPU上的进程信息

高级用法

  1. 实时监控(每秒更新):

    1
    gpustat -i 1 # -i 默认1秒更新
  2. 显示详细进程信息:

    1
    gpustat -cp
  3. 显示功率使用情况:

    1
    gpustat --show-power

分析要点

CPU负载分析

  1. 系统负载
  • 负载值/CPU核心数 < 0.7:系统很闲
  • 0.7 - 1.0:系统正常
  • 1.0:系统繁忙

ℹ️ 提示:CPU核心数 可以使用 lscpu 或 nproc 查看

  1. CPU使用率
  • 高us:用户进程消耗CPU
  • 高sy:内核消耗CPU,可能有系统调用过多
  • 高wa:IO瓶颈
  • 高id:CPU较空闲

GPU负载分析

  1. 显存使用
  • 查看是否有显存泄漏
    • 进程结束但显存仍被占用
    • 程序长时间运行,显存只增不减
  • 评估任务是否合理分配显存
  1. GPU使用率
  • 低使用率可能表示数据加载成为瓶颈
  • 持续100%表示计算密集型任务正常运行
  1. 温度监控
  • 通常应保持在85℃以下
  • 持续高温需要检查散热情况

在ROS2中使用Python虚拟环境

Posted on 2025-04-08 | In 软件配置

前言

在ROS2开发中,我们经常需要使用不同的Python包和依赖。使用Python虚拟环境可以帮助我们更好地管理这些依赖,避免包冲突,同时保持系统Python环境的清洁。本文将介绍如何在ROS2中配置和使用Python虚拟环境。

创建虚拟环境

  1. 首先,确保ROS2的环境已经被成功source:

    1
    source /opt/ros/foxy/setup.sh
  2. 在你的ROS2工作空间中创建虚拟环境

    1
    2
    cd ~/ros2_ws
    python3 -m venv venv --system-site-packages --symlinks
  • 第二个venv 是虚拟环境的名称
  • 如果venv 创建在了workspace中,那么需要创建COLCON_IGNORE文件,避免被colcon编译
    1
    touch COLCON_IGNORE
  1. 激活虚拟环境

    1
    source venv/bin/activate
  2. 在虚拟环境中安装必要的Python包

    1
    pip install torch # etc.

在ROS2中使用虚拟环境

  1. 在每一个package的setup.cfg文件中,添加以下代码:

    1
    2
    [build_scripts]
    executable = /usr/bin/env python3
  2. 编译你的package

    1
    colcon build
  3. 运行你的package

    1
    2
    source install/setup.bash
    ros2 run my_package my_node

注意事项

  • 每次打开新终端都需要重新激活虚拟环境
  • 确保在虚拟环境中安装了所有必要的Python依赖
  • 如果遇到找不到ROS2包的问题,检查是否正确source了ROS2和工作空间的setup文件

其他问题

1. 使用colcon build --symlink-install 命令时,会出现安装在虚拟环境的包无法被找到的问题。

解决方案:

  1. 在虚拟环境中强制重新安装colcon。
    1
    2
    3
    4
    5
    6
    source venv/bin/activate
    pip install --force-reinstall colcon-core setuptools==$(pip list --no-index --format=json | jq -r '.[] | select(.name=="setuptools").version')
    pip install colcon-common-extensions
    pip install -U pip
    pip install -U setuptools
    pip install -U importlib_metadata
  2. 使用当前环境的colcon编译ROS2包。
    1
    python -m colcon build --symlink-install

2. 使用anaconda虚拟环境。

思路与使用venv类似。

  1. 创建虚拟环境
    1
    conda create -n myenv python=3.8
  • 保证Python版本与系统Python版本一致。比如:ROS2 foxy 对应 Python 3.8
  1. 激活虚拟环境

    1
    conda activate myenv
  2. 在虚拟环境中安装必要的Python包

    1
    pip install torch # etc.
  3. 在ROS2的package中,添加以下代码:

    1
    2
    [build_scripts]
    executable = /usr/bin/env python3
  4. 编译你的package

    1
    colcon build
  5. 运行你的package

    1
    2
    source install/setup.bash
    ros2 run my_package my_node

参考资料

  1. Running ROS2 Nodes in a Python Virtual Environment - ROS2虚拟环境配置指南
  2. ROS2 官方文档:使用Python包 - Python包管理最佳实践
  3. ROS2 Issue: Python环境问题讨论 - 社区解决方案
  4. Setuptools Issue: 虚拟环境兼容性 - Setuptools相关问题解决

神经离散表示学习

Posted on 2024-06-27 | In 知识库

介绍

本文主要介绍离散表示学习,尤其是图像向量量化中的常见方法、工具和应用,主要是工具记录备忘。

VQ-VAE中的常用Loss

  1. VQ loss/ VQ Objective

Due to the straight-through gradient estimation of mapping from ze(x) to zq(x), the embeddings ei receive no gradients from the reconstruction loss log p(z|zq(x)). Therefore, in order to learn the embedding space, we use one of the simplest dictionary learning algorithms, Vector Quantisation (VQ). The VQ objective uses the l2 error to move the embedding vectors ei towards the encoder outputs ze(x) as shown in the second term of equation

  1. reconstruction loss

optimizes the decoder and the encoder (through the estimator explained above)

  1. commitment loss

since the volume of the embedding space is dimensionless, it can grow arbitrarily if the embeddings ei do not train as fast as the encoder parameters. To make sure the encoder commits to an embedding and its output does not grow,

  1. GAN loss

perceptually important local structure to alleviate the need for modeling low-level statistics with the transformer architecture

  1. perceptual loss

perceptually important local structure to alleviate the need for modeling low-level statistics with the transformer architecture

  1. entropy loss

$$
\mathbb{E}[H(q(z))] - H(\mathbb{E}[q(z)])
$$
an entropy penalty during training to encourage codebook utilization

工具介绍

vector-quantize-pytorch

基于Pytorch实现了VQ-VAE及其常见的变种、改进技巧。例如:

  1. Residual VQ
  2. SoundStream Initialization
  3. Lower codebook dimension
  4. Cosine similarity
  5. Expiring stale codes
  6. Orthogonal regularization loss
  7. Multi-headed VQ
  8. Random Projection Quantizer
  9. Finite Scalar Quantization
  10. Lookup Free Quantization:MaskGIT 基于这种向量化方法进行图像token化。MaskGIT的向量化的Pytorch实现:Phenaki - Pytorch
  11. Latent Quantization

STNN

时空Transformer的一种实现。向量化编码后的图像可以送入Transformer进行计算,时空Transformer是一种考虑时间和空间依赖关系的Transformer结构。不同于直接在3D空间中建模,时空Transformer通过在时间和空间维度上交错Attention来捕获时空关系。

Dcoker用法及指令

Posted on 2024-06-01 | In 软件配置

简介

Docker是操作系统层面的虚拟化技术,可以对文件系统、网络和进程进行隔离。与常见的虚拟化方式——虚拟机(Virtual Machine)不同,Docker不包含系统,只包含应用程序及其依赖,与原系统共享内核,因此更为轻量级,部署更轻便快捷。下图展示了Docker与虚拟机的对比。

-->

下载和卸载(Ubuntu)

下载

  1. 下载依赖和必要工具
    1
    2
    3
    sudo apt update

    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
  2. 添加下载密钥
    1
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  # 阿里云密钥
  3. 添加下载源
    1
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  # 阿里云源
  4. 下载Docker软件包
    1
    2
    sudo apt update 
    sudo apt install docker-ce docker-ce-cli containerd.io

卸载

1
sudo apt-get remove docker docker-engine docker.io

Docker启动

1
2
sudo systemctl enable docker
sudo systemctl start docker

设置Docker用户组

下载之后的Dcoker每次使用时需要添加 sudo 权限,这一方面带来指令上的麻烦,另一方面,在使用Docker相关插件时,如VSCode Docker插件可能会遇到权限问题。为了避免这个问题,可以在ubuntu中设置docker用户组,将需要使用docker的用户加入该用户组。

1
2
sudo groupadd docker # 新建 docker用户组
sudo usermod -aG docker $USER # 将当前用户加入 docker 用户组

使用Docker

镜像 (Image)

Docker 镜像是一种打包好的运行环境,包含除内核外的操作系统内容。镜像的命名规则为usrname/name:tag。镜像的常见指令如下:

1
2
3
4
5
6
7
docker image ls # 列出当前系统上的镜像文件
docker system df # 查看镜像容器存储大小
docker image ls -q # 列出所有镜像的ID
docker image ls -a # 列出所有镜像文件,包含中间层镜像
docker image ls name # 列出特定名字的镜像
docker image rm name # 删除特定名字的镜像
docker image rm $(docker image ls -q name) # 批量删除特定名字的镜像

容器 (Container)

Docker 容器是镜像的示例化。镜像的常见指令如下:

  • 启动容器
    1
    2
    3
    docker run username/name:tag command # 基于镜像 username/name:tag 启动容器,执行command后退出
    docker run -it username/name:tag command # 以 i(容器标准输入打开), t(分配伪终端<pseudo-tty>给容器)参数启动容器
    docker run -t username/name:tag command # 以守护态运行容器,Docker会在后台运行而不是直接把命令打印在当前主机下
  • 终止和重启容器
    1
    2
    3
    docker container stop container_id # 停止特定ID的正在运行的容器
    docker container start container_id # 启动特定ID的已终止容器
    docker container restart container_id # 重启特定ID的已终止容器
  • 查看容器
    1
    2
    docker container ls # 列出正在运行的容器
    docker container ls -a # 列出所有容器,包含已终止容器
  • 进入容器
    1
    2
    docker attach container_id # 进入特定ID的容器,此方式进入,退出会终止容器
    docker exec -it container_id bash # 进入特定ID的容器,此方式进入,退出不会终止容器
  • 删除容器
    1
    2
    docker container rm container_id # 删除特定ID的已终止容器
    docker container prune # 删除所有已终止的容器
  • 导入导出容器
    1
    2
    3
    docker export 7691a814370e > docker_image.tar # 导出特定ID的容器到docker_image.tar文件
    cat docker_image.tar | docker import - username/name:tag # 从docker_image.tar文件导入为镜像username/name:tag
    docker import http://example.com/exampleimage.tgz username/name:tag # 从某链接导入为镜像username/name:tag

网络 (Network)

Docker包含三个默认网络: host,none,bridge。其中bridge是默认模式,给容器分配独立的网络;host代表与主机贡献网络;none代表关闭网络功能,容器内部和外部机器/容器不能互相访问;

  • 查看当前网络
    1
    docker network ls # 列出当前主机上的docker网络
  • 启动时的网络参数
    1
    2
    docker run --net=host -d username/name:tag # 基于镜像 username/name:tag 启动容器,设定与主机共享网络
    docker run --net=container:container_id/name -d username/name:tag # 基于镜像 username/name:tag 启动容器,设定与特定ID或者名字的容器共享网络
  • 端口设置
    1
    2
    3
    4
    docker run -d -P username/name:tag # 随机分配一个主机的端口映射到容器的80端口
    docker run -d -p ip:host_port:container_port username/name:tag # 自定义端口映射
    docker logs container_id # 查看某容器网络访问记录
    docker logs container_id host_port # 查看某容器某端口配置

仓库 (Hub)

Docker 仓库存储了大量公开的镜像。自己也可以注册,创建公开或者私有的镜像。

  • Docker Hub登录和登出
    1
    2
    docker login # 交互式登录
    docker logout # 退出登录
  • Docker 拉取镜像
    1
    2
    docker pull username/name:tag # 拉取特定镜像到本地
    docker search key # 在Docker仓库里以特定关键词搜素镜像
  • Docker 推送镜像
    1
    docker push username/name:tag #  推送镜像username/name:tag到自己仓库

网络代理 (Proxy)

网络代理可以让docker的相关指令快速便捷地访问外网资源。

Docker Pull

在执行Docker Pull时,系统会将指令发送给守护进程dockerd执行,dockerd是独立于该指令的一个进程,因此需要将代理配置在dockered环境中,进行重启,代理才能生效。这个环境由systemd管控,可修改systemd配置来设置代理。

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d # 创建配置文件夹
sudo vim /etc/systemd/system/docker.service.d/proxy.conf # 打开配置文件

在打开的文件proxy.conf中写入

1
2
3
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"

其中127.0.0.1:7890字段需要根据自己的代理地址和端口调整。这里的127.0.0.1:7890表示代理中专的的地址是本地地址,端口是7890。在Clash中,代理默认是通过本地地址的7890端口中转的,代理端口的查看及Clash的其他相关信息可参考下载和配置Clash。

设置完成后,需要重载systemd并重启dockerd才能让配置生效:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Build

在执行Docker Build需要下载一些外网的安装包时,可在命令里加上如下参数

1
2
3
4
5
docker build . \
--build-arg "HTTP_PROXY=http://127.0.0.1:7890/" \
--build-arg "HTTPS_PROXY=http://127.0.0.1:7890/" \
--network host \
-t username/name:tag

Docker Build指令是在一个临时容器里运行的,容器的网络默认是与本机隔绝的。这里因为需要访问本机本地地址127.0.0.1,故需要假如参数--network host,如果代理地址是非本机的本地地址,则可不用加。

在使用Dockerfile构建镜像阶段,如果不使用代理,可以将官方源头替换成国内镜像来加速apt的更新和下载。

1
2
3
# 镜像源配置
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

Container 内部代理

在用户目录文件~/.docker/config.json中配置:

1
2
3
4
5
6
7
8
9
10
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:7890/",
"httpsProxy": "http://127.0.0.1:7890/"
}
}
}

更多参考

  1. Docker — 从入门到实践
  2. Docker Hub
  3. Jetson Container
  4. ROS Docker

配置TensorFlow

Posted on 2024-01-10 | In 安装配置

本文记录配置中的一些小问题

tensorflow, tensorflow-datasets, dm-reverb版本匹配问题

tensorflow和tensorflow-datasets因不同版本依赖的protobuf版本要求不同,可能会存在冲突。

dm-reverb是针对机器学习的数据存储和运输系统,与tensorflow一起使用时,强依赖于tensorflow版本,版本对应可以参考Reverb。

一种测试好的版本配置为

1
2
3
tensorflow==2.12.0
tensorflow-datasets==4.9.2
dm-reverb==0.11.0

pip下载命令

1
pip install tensorflow==2.12.0 tensorflow-datasets==4.9.2 dm-reverb[tensorflow]==0.11.0

tensorflow 日志输出屏蔽

通常tensorflow会在运行时输出一系列日志,屏蔽日志的方式为在import tensorflow之前使用os包,加入TF屏蔽语句,例如:

1
2
3
4
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import tensorflow as tf

其中,数字的对应关系如下所示,大数字的屏蔽内容包含小数字的屏蔽内容。
|Number|0|1|2|3|
|—|—|—|—|—|
|Log Level|INFO|WARNING|ERROR|FATAL|

tensorflow CPU 运行

tensorflow2的CPU和GPU版本是混合的,在加载tensorflow数据集时,会自动将数据集加载到显卡上,显卡可能会被全部占用。为了避免这个问题,可以强制tensorflow在CPU运行,这里提供两种方式:

  1. 设置GPU对tensorflow不可见。(全局屏蔽)
    1
    2
    3
    4
    import tensorflow as tf

    if len(tf.config.experimental.list_physical_devices('GPU')) > 0:
    tf.config.experimental.set_visible_devices([], 'GPU')
  2. 设置部分代码在CPU运行。(局部屏蔽)
    1
    2
    with tf.device('cpu'):
    # your code

安装CARLA模拟器

Posted on 2023-10-31 | In 安装配置

前言

CARLA是Nvidia开发的一款面向自动驾驶的模拟器,本文记录在Ubuntu服务器上安装CARLA模拟器的流程,文章在Ubuntu 20.04和Ubuntu 16.04上实验,安装CARLA 0.9.14版本。

CARLA for Ubuntu 20.04

官方的下载安装教程可以参考Quick start package installation,本文对该教程进行复述,附带部分遇到的问题和解决方案。

1. 下载CARLA模拟器

官方提供两种方式下载CARLA:Debian和 Package。

Debian

Debian下载方式支持Ubuntu 18.04 和 Ubuntu 20.04,该方式下载CARLA发布的Ubuntu软件安装包,安装在/opt/carla-simulator目录下。该下载方式需要root权限,而在一般的实验室服务器上,普通用户并无root权限,因此本文未测试该方法。这里提供官方的下载指令以供参考。

1
2
3
4
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1AF1527DE64CB8D9
sudo add-apt-repository "deb [arch=amd64] http://dist.carla.org/carla $(lsb_release -sc) main"
sudo apt update
sudo apt install carla-simulator # 安装 CARLA 0.9.10+ 的所有版本 或者 carla-simulator=0.9.14-1 只安装面向Ubuntu的0.9.14版本

Package

Package下载方式只区分Ubuntu和Winodws。该下载方式不需要root权限,只需在GitHub下载编译后的文件包,解压即可。

在Downlaod下载需求版本的编译后文件包,每个版本中,打有Ubuntu标签的有3个包,第一个CARLA_{version_number}.tar.gz是我们需要的。

1
2
3
4
5
[Ubuntu] CARLA_0.9.14.tar.gz
[Ubuntu] AdditionalMaps_0.9.14.tar.gz
[Ubuntu] CARLA_0.9.14_RSS.tar.gz
[Windows] CARLA_0.9.14.zip
[Windows] AdditionalMaps_0.9.14.zip

以CARLA 0.9.14为例,下载安装包到服务器

1
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.14.tar.gz

解压安装包的服务器某文件

1
tar -zxvf CARLA_0.9.14.tar.gz -C /path/to/carla-simulator/

2. 导入额外的资源

在Downlaod下载需求版本的资源包,第二个AdditionalMaps_{version_number}.tar.gz

以CARLA 0.9.14为例,下载额外资源包

1
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/AdditionalMaps_0.9.14.tar.gz

将下载后的额外资源包移动到CARLA模拟器根目录的Import文件夹内(通过Debian方式下载的模拟器根目录为/opt/carla-simulator)

1
mv AdditionalMaps_0.9.14.tar.gz /path/to/carla-simulator/Import/

导入额外资源包

1
2
cd /path/to/carla-simulator
./ImportAssets.sh

3. 下载CARLA客户端

针对0.9.12+版本的模拟器,官方提供了3种方式:.egg,.whl,Downloadable Python Package,文章测试了后两种。

.whl

在/path/to/carla-simulator/PythonAPI/carla/dist/目录下寻找有无适合版本的 .whl文件。如carla-0.9.14-cp37-cp37m-manylinux_2_27_x86_64.whl表示适合Python 3.7版本,Linux的.whl文件。

如果没有找到合适的版本可以去PyPI网站的carla安装包下载页面下载。例如:下载carla 0.9.14版本针对Python 3.8的安装包

1
wget https://files.pythonhosted.org/packages/c1/a2/6e172f2cc17e6ad9f9853f18dd4f99c5d05d5a241ce2ba4a2daa73eff695/carla-0.9.14-cp38-cp38-manylinux_2_27_x86_64.whl

下载完成之后,需要修改文件名为符合pip命名规范的安装包,才能正常安装(这里建议安装前升级pip)。

1
2
3
mv carla-0.9.14-cp38-cp38-manylinux_2_27_x86_64.whl carla-0.9.14-cp38-cp38-manylinux1_x86_64.whl
pip install --upgrade pip
pip install carla-0.9.14-cp38-cp38-manylinux1_x86_64.whl

这里pip安装包命名规范查看命令为:

1
pip debug --verbose

如果没有找到安装包,可以从源码编译。

Downloadable Python Package

直接使用pip下载。

1
pip install carla

文章测试了下,这种方式最多只能安装0.9.5版本。

4. 运行CARLA服务端

1
2
cd /path/to/carla-simulator
./CarlaUE4.sh

运行CARLA服务端的一些常用参数

1
2
3
4
5
./CarlaUE4.sh -RenderOffScreen # 无屏幕渲染
./CarlaUE4.sh -carla-rpc-port=N # 指定服务端连接端口为N(默认2000),数据流端口为N+1
./CarlaUE4.sh -carla-streaming-port=N # 指定数据流端口为N。N=0表示随机获得一个未被使用的端口。
./CarlaUE4.sh -quality-level={Low,Epic} # 改变渲染精度(默认Epic),Low将不渲染阴影,限定光线计算在50m内
./CarlaUE4.sh -graphicsadapter=GPU_ID # 指定GPU ID运行,Carla的GPU ID从1开始计数(默认为1,如果在第一个GPU上训练,不用指定该参数)

CARLA 相关的代码、文档和学习资源

Document Home

First Step

CARLA Source Code

其他尝试案例和问题记录

Ubuntu 20.04

Q: 在运行./CarlaUE4.sh时出现

1
error while loading shared libraries: libomp.so.5: cannot open shared object file: No such file or directory

A: 联系服务器管理员,下载libomp5。

1
sudo apt install libomp5

Q: 在运行./CarlaUE4.sh时出现

1
MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0 ../src/intel/isl/isl.c:2105: FINISHME: ../src/intel/isl/isl.c:isl_surf_supports_ccs: CCS for 3D textures is disabled, but a workaround is available.

A: 添加VK_ICD_FILENAMES到~/.bashrc文件。

1
export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"

Q: 在运行./CarlaUE4.sh时出现

1
WARNING: lavapipe is not a conformant vulkan implementatio , testing use only.

A:在第一个GPU上训练时,去掉GPU指定参数-graphicsadapter=GPU_ID。

Ubuntu 16.04

Q: 安装与Ubuntu 20.04相似的方式安装,在运行./CarlaUE4.sh时出现

1
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found

A: 暂无好的解决方案,Ubuntu 16.04的glibc版本为2.23,建议切换到Ubuntu 18.04/Ubuntu 20.04。文章这里下载glibc-2.27源码编译后,没能运行成功,而且Ubuntu的Shell指令如ls也崩溃了。

1
ldd --verison # 检查glibc版本

从源码安装glibc(glibc-2.27为例)

1
2
3
4
5
6
7
8
9
wget https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz
tar -zxvf glibc-2.27.tar.gz
cd glibc-2.27
mkdir build
cd
../configure --prefix=/path/to/glibc-install # 配置make下载地址
make
make install
export LD_LIBRARY_PATH=/path/to/glibc-install/lib:$LD_LIBRARY_PATH # 添加该句到~/.bashrc以声明库路径

Ubuntu 16.04 从源码编译

按照源码编译教程,编译,并未成功。
问题记录如下

Q: 在make PythonAPI时出现libproj包编译问题

1
2
3
....../PythonAPI/carla/dependencies/lib/libproj.a(geodesic.c.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
....../anaconda3/envs/carla/compiler_compat/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status

A: 按照Carala GitHUb Issue并未解决。相关Issue: Additional Python API in pre-build carla package。

深度学习模型存储格式

Posted on 2023-10-11 | In 数据格式

前言

本文记录出行在深度学习中的各类模型存储格式,不定期持续更新。

存储格式

PyTorch .pth/.pt/.pkl/.pth.tar

二进制文件,用于保存模型参数,后缀不同在保存上并没有区别。

模型保存

1
2
3
model_saver = {'model':model.state_dict()} # 也可以添加其他项目,如epoch,optimizer, scheduler
# model_saver.update({'epoch':10})
torch.save(model_saver,'storage_name.pth')

模型读取

1
2
3
model_saver = torch.load('storage_name.pth')
model = NNModel(*args, **kwargs) # 初始化模型
model.load_state_dict(model_saver['model'])

也可以直接保存model.state_dict()而不是字典。这样在读取时,也不需要用键在字典中查询。

也可以直接保存整个模型,这样不用重新初始化模型,但会占用更多存储,增加读取时间。

模型保存

1
torch.save(model,'storage_name.pt')

模型读取

1
model = torch.load('storage_name.pt')

ONNX

ONNX(Open Neural Network Exchange)开放式神经网络交换格式,用于统一多种训练框架导出的模型,如PyTorch,TensorFlow,Scikit-learn。

Python 使用记录

Posted on 2023-10-11 | In 软件使用

前言

本文记录Python相关的一些用法,随机记录。

记录

pip

1
2
3
pip install -qqq xxx # 1个q: 只显示警告、错误、关键日志信息;2个q: 只显示错误、关键日志信息 ;3个q: 只关键日志信息
pip install -r requirement.txt # 从依赖文件下载安装包
pip install --upgrade xxx # 更新过期的第三方库

字符串

1
2
3
r'D:\xxx\yyy\zzz.py' # 防止 '\' 被Python转义。此处如无r,则需要使用 '/' 才能被识别为正确路径
f'{name} is doing {event}' # 使用格式化字符(f-string)方式定义字符。
'{} is doing {}'.format(name,event) # 类似于格式化字符的用法

星号用法

基础用法

1
2
a * b  # 乘法
a ** b #幂次

形式参数

单星号:接受任意多个非关键字参数,解析为元组形式,例如:

1
2
def function(*arg_tuple) 
# function(1,2,3) -> arg_tuple = (1,2,3)

双星号:接受任意多个关键字参数,解析为字典形式,例如:

1
2
def function(**arg_dict) # 
# function(a = 1, b = 2, c = 3) -> arg_dict = {'a':1, 'b':2, 'c':3}

实际参数

单星号:将元组/列表变量拆分为多个单元素传入函数,例如:

1
2
3
def function(a, b, c) 
x = [1,2,3]
function(*x)

双星号:将字典变量拆分为多个键值对传入函数,例如:

1
2
3
def function(a, b, c) 
x = {'a':1, 'b':2, 'c':3}
function(**x)

装饰器

@dataclass

自动生成 __init__() 函数。

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
@dataclass
class DataObject:
x: float
y: float
z: float
w: float
time: int

def __post_init__(self):
pass
q_data = {'x':0,'y':0,'z':0,'w':0,'time':datetime.datetime(2023,10,12,0,0)}
DataObject(**q_data)

示例中,会自动生成 __init__(x,y,...),执行完__init__后会执行__post_init__作为对__init__的补充。其中类型提示是弱提示,在运行过程中,会根据实际类型自动适应。

在使用类型注解时,可能会出现,类型注解部分解析过早,但类还未创建完成,导致NameError: name 'ClassName' is not defined错误。在脚本前面加入下述语句,可以延迟类型注解。防止该问题发生。

1
from __future__ import annotations

@property

将一个方法变为属性

1
2
3
4
5
6
7
8
9
10
11
12
13
class DataObject:
x: float
y: float
z: float
w: float

@property
def time(self):
return '2023-10-17'

q_data = {'x':0,'y':0,'z':0,'w':0}
q = DataObject(**q_data)
q.time

特性用法

类型注解

类型注解是Python中指定变量类型的一种方式,类似C/C++在声明变量时指定的参数类型一样。类型注解教程可参考Python类型注解。

内置方法

slots

对class中__slots__赋值定义可以限制class允许添加的属性。

内置库

pathlib

面向对象的文件系统路径管理库,用于跨平台的文件路径管理和文件操作。基础用法可参考Python路径操作模块pathlib。

shutil

高阶文件操作库,用于复制、移动、删除文件和创建、解压压缩包。简单用法可参考shutil模块详解。

multiprocessing

多进程操作库,用于多进程创建、通信、互斥和关闭。简单用法可参考Python多进程初探–multiprocessing 模块。

外部库

einops

提供张量简便操作的库。具体用法可参考Einops Tutorials。

  1. 将张量的维度置换、增加、去除总结为3个操作:rearrange,repeat,reduce。
  2. 将张量的维度连接和分割总结为2个操作pack和unpack。
  3. 能够在常用框架中通过EinMix layers引入变换层,方便搭建神经网络。

psutil

用于监控系统资源和进程对系统资源的使用率,如CPU、内存、硬盘、网络、传感器。具体用法可参考psutil Project description。

GPUtil

用于获取系统GPU资源信息,如GPU的显存使用率,可用显存,驱动版本,序列号等。具体用法可参考GPUtil获取系统状态信息

dotmap

有序、动态扩展的点访问字典。同时具备键值对查询和点查询。具体用例可参考PyPI dotmap project

cachetools

数据缓存包,支持常见的数据缓存策略,如:Least Recently Used (LRU),First-In-First-Out (FIFO)等。使用键值对进行查找。具体用例可参考cachetools或Python缓存神器cachetools。

beartype

以近乎实时的性能进行静态类型检查。具体用例可参考beartype。

Hydra 记录

Posted on 2023-10-10 | In 软件使用

Output/Working directory

设置hydra.job.chdir=True将Working directory设置为Output directory。在Hydra 1.2之后,该参数默认为False。Working directory与正常Python文件的工作目录一致。

ROS2安装简要

Posted on 2023-10-07 | In 软件配置

前言

ROS2 是新一代机器人操作系统,可以适配如Windows, Ubuntu多种计算机操作系统。
本文基于Ubuntu 20.04,采用apt安装。

教程

  1. 参考创客智造安装。

  2. 在添加ros源步骤,使用清华ROS2源,选择Ubuntu 20.04系统。

数据存储格式

Posted on 2023-09-15 | In 数据格式

本文列出一些常用的数据存储格式,说明其内容,特点,基于Python使用方法。

json

hdf5

csv

pkl

npz

linux 常见符号释意

Posted on 2023-04-25 | In 软件使用

前言

本文记录了一些Linux常见符号的释意,用于记录和备忘。

符号

文件颜色

使用ls指令时返回的文件目录通常有不同颜色,表示文件的类型。

颜色 白色 蓝色 浅蓝色 绿色 黄色 红色
含义 普通文件 文件夹 链接文件 可执行文件 设备文件 压缩文件

git-指令备忘

Posted on 2023-03-20 | In 软件使用

代码里统计

  • 统计某段时间某人的代码量。例如:统计 zhanglixuan0720 于 2023-03-00 到 2023-03-31 间提交的代码行数。
    1
    git log --author="zhanglixuan0720" --since=2023-03-00 --until=2023-03-31 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

Nginx的下载与配置

Posted on 2023-03-17 | In 软件配置

前言

Nginx是一个高性能的HTTP和反向代理web服务器,使用Nginx可以简单地完成网站部署。
本文在Ubuntu20.04下测试进行。

下载

1
2
$ sudo apt update
$ sudo apt install -y nginx

配置

网站部署

主页部署

将网站的.html文件移到/var/www/html目录下,即可在服务器对应的ip主页看到部署的网页。例如:服务器公网IP为:xxx.xxx.xxx.xxx,在浏览器中输入xxx.xxx.xxx.xxx后即可看到部署的网页。

其他页部署

如需部署一个网页在 xxx.xxx.xxx.xxx/page 下,可按照如下流程进行。

  1. 在/var/www/目录下创建文件夹page
    1
    $ sudo mkdir -p /var/www/page
  2. 在/etc/nginx/sites-available/default文件内加入
    1
    2
    3
    4
    5
    location /page {
    alias /var/www/page;
    index index.html index.htm;
    try_files $uri $uri/ =404;
    }
  3. 重新加载Nginx配置信息

端口转发

如需转发某路径 xxx.xxx.xxx.xxx/path 到本地某端口(如4090),可按照如下流程进行。

  1. 在/etc/nginx/sites-available/default文件内加入
    1
    2
    3
    location /path {
    proxy_pass http://127.0.0.1:4090;
    }
  2. 重新加载Nginx配置信息

常用指令

1
nginx -s reload # 重新加载Nginx配置信息

Linux 常用工具

Posted on 2023-03-17 | In 软件使用

前言

本文记录了一些Linux常用工具及其指令,用于备忘和查找,无序排列。

工具

Tmux

在使用Linux终端时,一般关闭终端(会话窗口),终端中运行的程序也会中止。Tmux 支持Linux会话与窗口的分离,在会话与窗口分离后,会话中的程序仍然在运行。同时,Tmux支持用户重新绑定到某次会话上,在之前分离的会话上继续操作。

下载

1
$ sudo apt install tmux

常用指令

注:注释括号中的字符为对应指令快捷键。针对 Ctrl+b 的前缀快捷键,需要先按下 Ctrl+b, 松开后再按其他键。

1
2
3
4
5
6
7
8
$ tmux # 进入Tmux窗口,这时会新建一个会话
$ exit # 退出Tmux窗口,这时会话被关闭 (Ctrl+d)
$ tmux new -s session-name # 新建一个名为session-name的会话
$ tmux attach -t session-num/session-name # 重新绑定到某会话,可以使用会话名或者会话编号指定会话
$ tmux detach # 将当前会话与窗口分离 (Ctrl+b d)
$ tmux ls / list-session # 查看当前所有Tmux会话
$ tmux kill-session -t session-num/session-name # 杀死某会话,可以使用会话名或者会话编号指定会话
$ tmux rename-session -t session-num new-name # 重命名会话编码为session-num的会话名为new-name (Ctrl+b $)

其他快捷键

1
Ctrl+d [ # 查看会话日志消息(输出的内容)

参考链接

Tmux 使用教程

Tree

Tree 是一种以树型结构显示文件夹目录结构的工具

下载

1
$ sudo apt install tree

常用指令

1
2
3
4
$ tree # 显示当前文件夹目录结构
$ tree --help # 查看帮助信息
$ tree -L N # 显示当前目录第N级的目录和文件
$ tree > filename # 将目录结构信息保存在文件中

X

在服务器上使用模拟器,如Habitat时,尽管已经按照文档安装了headless版本,但仍然可能会提示DISPLAY not detected. For headless systems, compile with --headless for EGL support,为了解决该问题,一种方式是从源码编译headless版本,另一种方式是使用X构建虚拟屏幕。

  • 启动X:
    1
    2
    $ sudo nohup X :99 & disown # nohup启动
    $ sudo X :99 # 在tmux框中启动
  • 使用虚拟屏幕
    1
    $ export DISPLAY=:99
    注:这里数字可以换成0之外的任何数字,0是默认屏幕,启动0可能会产生冲突

如果用户没有sudo权限,可以申请服务器管理员修改/etc/X11/Xwrapper.config文件,写入

1
allowed_users = anybody

Linux 常用指令

Posted on 2023-03-07 | In 软件使用

前言

本文记录了一些Linux指令,用于备忘和查找,无序排列。

指令

查看系统内核版本(多条可用指令)

1
2
$ cat /proc/version
$ uname -srm

在本地和远程之间复制文件

  • scp指令
    1
    2
    $ scp username@servername:/path/filename local_dir # 从远程机器下载文件
    $ scp /local_path/filename username@servername:/path # 上传本地文件到远程机器
  • rsync 指令
    1
    2
    3
    4
    5
    6
    rsync -av -e ssh --exclude='*.pth' username@servername:/path/filename local_dire # 从远程机器下载文件
    rsync -av -e ssh --exclude='*.pth' /local_path/filename username@servername:/path # 上传本地文件到远程机器
    -a:递归目录
    -v:详细输出
    -e ssh:使用ssh作为远程shell,保证传输过程加密
    --exclude='*.pth':排除匹配文件

zip 压缩/解压缩文件

1
2
3
4
5
6
7
8
9
$ zip -r filename.zip filename filedir/ # 压缩指定文件和文件目录
$ zip -d filename.zip filename # 从指定压缩包中删除指定文件
$ zip -u filename.zip filename # 追加指定文件到指定压缩包中
$ zip -f filename.zip filename # 更新指定压缩包中指定文件
$ zip -e filename.zip filename # 加密压缩文件,密码会提示输入
$ unzip filename.zip -d filedir # 解压缩文件到指定目录
$ unzip -o filename.zip # 不必询问用户,unzip后覆盖原有的文件
$ unzip -t filename.zip # 检查压缩文件是否正确
$ unzip -l filename.zip # 显示压缩文件内所包含的文件

tar 压缩/解压缩文件

1
2
$ tar -zcvf filename.tar.gz filename # 压缩指定文件或文件目录
$ tar -zxvf filename.tar.gz -C filedir # 解压缩文件到指定目录

常用参数选项

1
2
3
4
5
6
7
8
9
10
-z --gzip, --gunzip, --ungzip   :通过 gzip 来归档压缩,压缩后的文件为*.tar.gz
-j --bzip2 :通过 bzip2 来归档压缩文件,压缩后的文件为*.tar.bz2
-J : 通过 xz 压缩工具归档压缩文件,压缩后的文件为*.tar.xz,压缩率最高,也最慢
-c --create :创建新的归档文件,压缩文件
-x --extract :解压文件
-v --verbose :可视化,显示tar处理文件的输出信息
-f --file :要操作的文件名
-t --list :查看文件中的内容
-C --directory=DIR :解压文件至指定的目录
--exclude=DIR :压缩时排除某目录/文件

进程

1
$ ps aux|grep python # 显示所有与python相关的进程

ps常用参数选项

1
2
3
4
5
6
-a 显示现行终端机下的所有程序,包括其他用户的程序
-A 显示所有程序
-u 以用户为主的格式来显示进程状况
-x 显示所有进程,不以终端机来区
-H 显示树状结构,表示进程间的关系
-f 用ASCII字符显示树状结构,表示进程间的关系
1
2
3
4
5
6
$ kill -l # 查看linux下所有信号
$ kill -9 PID_NUM # SIGKILL 强制杀死进程PID_NUM
$ kill -1 PID_NUM # SIGHUP 重新加载或者杀死PID_NUM
$ kill -2 PID_NUM # SIGINT 键盘输入中断(Ctrl+C)
$ kill -3 PID_NUM # SIGQUIT 键盘输入退出(Ctrl+|)
$ kill -6 PID_NUM # SIGABRT 根据abort(3)杀死进程(非正常中止)

fuser

fuser 功能:显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息。更多参考见Linux fuser 命令详解

1
2
$v fuser -v /dev/nvidia* # 显示当前有哪些占用GPU资源的pid

文件查找

  • find
    1
    $ find / -name filename # 在指定目录(/)下寻找指定文件
    fidn的常用参数
    1
    2
    3
    4
    5
    -name s     #寻找文件名带s的文件
    -name *s #寻找以s结尾的文件
    -name s* #寻找以s开头的文件
    find -amin 10 #寻找过去10分钟访问过的文件
    find -mtime 1 #寻找过去24小时修改过的文件
  • locate
    1
    $ locate filename # 定位文件位置
    该方法从Linux文件数据库中查找,效率更高。但该数据库默认一天更新一次,最近新建文件无法找到,可用如下指令更新该数据库
    1
    sudo updatedb
  • 全面搜索正则表达式
    1
    2
    $ grep xxx # 在输出中查找带有xxx的行
    $ grep -v xxx # 滤掉输出中带有xxx的行
  • 全面搜索正则表达式配合使用的指令
    1
    $ cut -c 9-16 # 在输出的每行中选取9到16行(不包含第16行)返回

    ssh密钥生成

    1
    $ ssh-keygen -t rsa
    生成的密钥存放在~/.ssh文件夹下。

    watch

watch 提供了周期性的方式执行给定的命令的功能。

1
$ watch -n 1 nvidia-smi # 每隔一1秒查看一次显存信息

磁盘大小统计

1
2
$ df -h # 统计磁盘分区大小和使用情况
$ du -sh # 统计当前目录大小

建立软链接

1
$ ln -s source target-symbol # 将source 软连接到target-symbol目录下/target-symbol文件

注:使用target-symbol软链接时,若出现报错Too many levels of symbolic links,将source和target-symbol改为绝对路径即可。

文件查看

1
2
$ ls|wc –l # 查看当前目录文件数量
$ ls -hl filename # 查看文件详细信息,大小换成用户可读单位

命令二次解释

1
$ eval command_with_param # 将参数连接在一起构造指令,并执行

例如:eval echo '$'$# 会先将 指令翻译为echo ${param_num},然后执行指令echo ${param_num}。

Bash $+x 含义

此处方便起见,省去代表bash指令的$

1
2
3
4
5
6
$0 # 执行脚本的文件名
${number>=1} # 脚本的第 number 个参数
$# # 传入脚本的参数个数
$@ # 传入脚本的所有参数,不包括$0表示的文件名,得到一个字符串数组
$* # 传入脚本的所有参数,不包括$0表示的文件名,合并成一个字符串
$? # 执行脚本的返回值,没有主动exit/return时,默认返回0

identify

查看图像参数信息

1
identify image_name # 查看图像具体信息

指令用例

1
tmux ls | grep -oP '^\S+' | grep wm | sed 's/://g' | xargs -I {} tmux kill-session -t {}

提取tmux中以wm开头的会话名称,并kill这些会话。

从源码编译安装Realsense SDK 2.0

Posted on 2023-03-07 | In 软件配置

前言

使用内核较新的Ubuntu系统时,常常没有支持的二进制可下载SDK,因此需要从源码编译安装Realsense SDK2.0,虽然Realsense官方给出的安装流程已经很全面,但在实际操作时,仍然有一些问题,因此需要该文档。

本文主要目的是辅助从源码编译安装Realsense SDK2.0,但仍然加入了下载Realsense-ROS-Wapper的步骤,使用该文档可同时完成 Realsense-SDK (from source) 和 Realsense-ROS-Wapper (from bin) 的下载配置。

本文面向Ubuntu系统,测试系统为x86架构64位系统,内核版本为5.15.0-67-generic。

下载安装

  1. 以二进制形式下载Realsense-ROS-Wapper

    1
    2
    $ sudo apt install ros-$ROS_DISTRO-realsense2-camera
    $ sudo apt install ros-$ROS_DISTRO-realsense2-description

    在Realsense-ROS-Wapper中介绍了 Method 1: The ROS distribution,可以以二进制方式下载Realsense-ROS-Wapper,但下载后一般无法正常使用,仍然需要下载Realsense SDK 2.0。Method 2: The RealSense™ distribution - Step1 介绍了如何安装Realsense SDK 2.0,但对于新版本的Ubuntu,一般无法成功,需要从源码安装。从源码安装的参考页面为the instructions under Linux Installation,下文将基于该页面进行。

  2. 下载Realsense SDK 2.0源码
    从GitHub下载Realsense SDK 2.0。

    1
    $ git clone https://github.com/IntelRealSense/librealsense.git
  3. 进入 librealsense 目录,执行命令,这一步及后续步骤中,系统不能接入摄像头。

    1
    2
    3
    4
    5
    6
    $ cd librealsense
    $ sudo apt install git libssl-dev libusb-1.0-0-dev libudev-dev pkg-config libgtk-3-dev
    $ sudo apt install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev at
    $ ./scripts/setup_udev_rules.sh
    $ ./scripts/patch-realsense-ubuntu-lts-hwe.sh # Build and apply patched kernel module
    $ echo 'hid_sensor_custom' | sudo tee -a /etc/modules
  4. 编译Realsense SDK 2.0

    1
    2
    3
    $ mkdir build && cd build
    $ cmake ../ -DFORCE_RSUSB_BACKEND=true -DCMAKE_BUILD_TYPE=release -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=true
    $ sudo make uninstall && make clean && make && sudo make install
  5. 检查安装效果

    1
    $ realsense-viewer

    如出现GUI框,并且接入摄像头后可以正常使用,证明安装成功。

realsense 参数配置

待扩充…

下载和安装Anaconda

Posted on 2023-03-07 | In 软件配置

引言

Anaconda 是最常用的数据科学平台,使用 Anaconda 可以简化 Python 软件包系统管理和部署。

本文面向Ubuntu系统,测试系统为x86架构64位系统。

下载安装

  1. 从Anaconda官网下载最新版Anaconda,如,可在下载页面下载Anaconda3-2022.10-Linux-x86_64.sh。如无法打开该网页,可前往清华大学镜像下载。

  2. 在下载目录中找到.sh文件运行。

    1
    2
    $ cd ~/Downloads/
    $ sh Anaconda3-2022.10-Linux-x86_64.sh

    下载过程中,根据提示,按Enter和yes即可,下载后的 Anaconda 位于 ~/anaconda目录下。

常用 conda 指令

  • 创建环境
    1
    2
    $ conda create -n env_name python=3.7 # 创建基于Python3.7,名为env_name的环境
    $ conda create -n env_name --clone cloned_env_name # 从名为cloned_env_name的环境复制一个相同的,名为env_name的环境
  • 激活/进入环境
    1
    $ conda activate env_name
  • 退出环境
    1
    $ conda deactivate
  • 查看当前系统环境
    1
    2
    $ conda info --envs
    $ conda env list
  • 移除环境
    1
    $ conda remove -n env_name --all
  • 下载和管理package
    1
    2
    3
    4
    5
    6
    7
    conda install pkg_name==<版本号> # 安装指定版本的Python库,去掉版本号会安装最新的包
    conda install -c <Python库链接> # 从指定链接安装Python库
    conda unistall pkg_name # 卸载指定Python库
    conda update pkg_name # 更新指定Python库
    conda update --all # 更新所有Python库
    conda list # 查看所有第三方Python库
    conda list -n env_name # 查看指定环境的所有Python库

常用 pip 指令

pip 是常用的Python包下载工具

  • 下载和管理package
    1
    2
    3
    4
    pip install pkg_name==<版本号> # 安装指定版本的Python库,去掉版本号会安装最新的包
    pip install -r requirements.txt # 从依赖文件安装Python库
    pip unistall pkg_name # 卸载指定Python库
    pip show pkg_name # 显示指定Python库的信息
  • 升级pip
    1
    pip install -U pip

环境打包与迁移

conda-pack

  • 打包环境
    1
    2
    3
    4
    pip install conda-pack # 下载打包软件库
    conda pack -n env_name # 打包环境(打包为env_nam.tar.gz文件)
    conda pack -n env_name --ignore-editable-packages # (Optional) 忽略可编辑的软件库。当环境存在可编辑的软件库时,常规打包指令会失败
    conda pack -n env_name --ignore-missing-files # 忽略缺少的文件。当出现环境文件不一致,缺少某些文件时,常规打包指令会出错。
  • 迁移环境
    1
    2
    3
    mkdir env_name
    tar -xzf env_nam.tar.gz -C env_name # 解压打包后的环境
    mv env_name ~/anaconda3/envs/ # 移动环境到anaconda目录

environment.yaml

  • 打包环境
    1
    conda env export > environment.yml 
  • 迁移环境
    1
    conda env create -f environment.yml

Error

1
2
3
4
This is usually due to `pip` uninstalling or clobbering conda managed files,
resulting in an inconsistent environment. Please check your environment for
conda/pip conflicts using `conda list`, and fix the environment by ensuring
only one version of each package is installed (conda preferred)

Answer:

1
conda pack -n env_name --ignore-missing-files

配置NVI系统

Posted on 2023-03-07 | In NVI-Project

引言

该文档仅适用于VIPL-NVI Project系统配置,且为提纲式的说明,暂不适用于其他系统。

NVI-EDGE

Hardware

  1. 购买硬件设备:mini-PC、硬盘、内存、mini-PC电源线(!!!)。
    特别说明:
    mini-PC:须至少有3个及以上 USB-A 3.0+ 接口,网卡 WIFI-6 和 Bluetooth5.0 标准;
    硬盘:固态1T+。
    内存:16GB+。

  2. 安装硬件设备并启动。

Software

  1. 安装 Ubuntu20.04 系统,默认配置,直接刷机。系统设置为开机自动登录,密码与其他机器密码保持一致。计算机名建议为“某小组英文名-vipl”。

  2. 连接至 NVI Project 专用局域网,并配置IPv4地址为 192.168.1.* | 255.255.255.0 | 192.168.1.1 。
    其中*的合法取值为1-254,这里建议*>200。

  3. 更换国内源,可参考配置Ubuntu。

  4. 下载配置必备系统工具,可参考配置Ubuntu,下载完成后,开启ssh,以方便远程连接。

    1
    ssh start
  5. 下载和配置Clash,可参考下载和配置Clash。(可选)

  6. 下载和配置Pinyin,可参考配置Ubuntu。(可选)

  7. 下载VSCode,可参考配置Ubuntu。

  8. 下载安装Anaconda,可参考下载和安装Anaconda,下载完成后,创建 NVI-Project 环境,用于下载后续Python包。建议环境名以edge结尾,如需配置好的环境,可联系lixuan。

  9. 下载安装ROS,可参考安装并配置ROS环境(Noetic版本)。参考教程中,最后一行的更新如不成功,可以跳过。下载完成后,在 Step7 创建的 NVI-Project 环境中,下载软件包

    1
    pip install rospkg catkin_tools pip install empy

开始配置 NVI-EDGE ROS 包环境,NVI-EDGE 环境按照各个包README.md配置即可,注意各个包可发邮件到lixuan申请获取,另外这里特殊说明几个包的配置。

  1. 拷贝system_config中文件到指定位置(按照对应文件注释操作即可)。
    其中udev相关配置重启后生效。

  2. 下载配置 Realsense-SDK (from source) 和 Realsense-ROS-Wapper (from bin),并进行配置,可参考ROS Wrapper for Intel® RealSense™ Devices和从源码编译安装Realsense SDK 2.0

  3. 如需用system_management package,需下载octomap_msgs package。

    1
    sudo apt-get install ros-$ROS_DISTRO-octomap-msgs

配置Ubuntu

Posted on 2023-03-07 | In 软件配置

安装Ubuntu系统后,需要安装或配置一些软件包,以提升使用体验,这里列举几个常用的配置及其链接。
注:下述配置均基于Ubuntu 20.04测试。

  1. 更换下载源
    使用国内源而非Ubuntu官方源,将提升下载速度。

  2. 安装必备系统工具

1
sudo apt install ssh net-tools vim htop iputils-ping
  1. Google Pinyin
    如果Ubuntu系统以英文安装,需要中文输入的用户需要下载中文字体。

  2. VSCode
    VSCode是一款优秀的代码编辑器,值得下载配置。在官网下载即可,Ubuntu须下载 Linux x64 中 .deb结尾软件包。
    下载命令:(*表示下载的版本,这里输入code后用Tab补全即可)

    1
    2
    cd ~/Downloads/
    sudo apt install ./code_*
  3. 配置静态IP
    在局域网中,配置静态IP可以方便其他机器连接。

  4. 双系统时间同步
    让Ubuntu时间与BIOS同步

    1
    timedatectl set-local-rtc 1 

udev-配置

Posted on 2023-03-06 | In 软件配置

引言

在Ubuntu系统中使用串口时,串口名常常以/dev/ttyUSB0,/dev/ttyACM0等形式出现,用以区分不同设备。当多个相同类型的设备被接入系统时,如/dev/ttyACM*类型设备,会出现/dev/ttyACM0,/dev/ttyACM1,/dev/ttyACM2等多个串口名。串口名后数字用于区分不同设备,该数字通常由设备上电的顺序决定。当编写程序读取多个同类设备时,不同设备对应的程序可能不同,但由于程序中的串口名是给定好的,这就对设备上电的顺序有了要求。例如:Arduino串口和某RTK-GPS设备串口名都是/dev/ttyACM*,程序1用于读取Arduino串口,串口名设置为/dev/ttyACM0,程序2用于读取RTK-GPS串口,串口名设置为/dev/ttyACM1,当上电顺序不同时,程序可能会出错。

为了使设备名不受接入系统(上电)顺序的影响,可以采用udev对不同设备配置不同型号。

udev 示例

一个编写好的,用于设置某设备静态串口名的udev文件如下所示:

1
KERNEL=="ttyACM*", ATTRS{idVendor}=="1546",ATTRS{idProduct}=="01a9",SYMLINK="ttyGPS"

KERNEL:系统匹配的原串口名;
idVendor:厂商号;
idProduct:产品号;
SYMLINK:设置的静态串口名,以软链接的形式存在。
将该文件以NUM-FILENAME.rules的形式保存在/etc/udev/rules.d文件下,重启系统后,系统若识别到满足要求的设备,就会添加/dev/ttyGPS软链接,指向/dev/tyyACM*。该文件名中的NUM指示了系统运行各种.rules文件的顺序,取值范围为0~99。例如命名某.rules文件

其中idVendor和idProduct可以由lsusb指令查询得到

1
$ lsusb

如下Bus 004,ID中1d6b表示idVendor,0003表示idProduct。

1
2
3
4
5
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 8087:0033 Intel Corp.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

相关指令

查看当前连接的设备

1
$ ls /dev/

查看当前连接的某类型设备,如:ttyACM*

1
$ ls /dev/ttyACM*

查看电脑连接的串口设备

1
$ lsusb

相关链接

udev规则以及编写

下载和配置Clash

Posted on 2023-03-03 | In 软件配置

Clash 是一个Go语言开发的多平台代理客户端,用户可以使用Clash在多个平台,如Windows,Linux,Android等平台上使用代理服务。

Clash on Ubuntu

Ubuntu是Linux系列的常用系统,本文主要在Ubuntu上进行了测试,其他系统一般也会有效。

Install Package

  1. 下载Clash安装包
    从clash_for_windows_pkg的GitHub页面下载对应版本,以基于X86架构的Ubuntu系统为例,在Assets中下载Clash.for.Windows-0.20.17-x64-linux.tar.gz。

  2. 解压Clash安装包
    解压 *.tar.gz 文件,移动到~/目录下,命名为clash。

  3. 运行文件
    进入clash文件夹内,找到cfw文件,运行即可。

    1
    $ ./cfw

Create Desktop Shortcut

  1. 下载clash图标文件,存放至clash文件夹内。如下所示,右击选择下载即可获得。

  2. 在桌面创建文件clash.desktop,写入以下内容,注意将其中的usrname替换为自己的用户名

    1
    2
    3
    4
    5
    6
    7
    8
    [Desktop Entry]
    Version=1.0
    Type=Application
    Terminal=false
    Exec=/home/usrname/clash/cfw
    Name=Clash
    Comment=Clash for Windows
    Icon=/home/usrname/clash/clash.png
  3. 右击桌面clash图片,点击Allow Launching即可正常使用。

Clash on Windows

Install Package

从clash_for_windows_pkg的GitHub页面下载对应版本。例如:在Assets中下载Clash.for.Windows.Setup.0.20.16.exe。双击安装即可。

Additional Usage Instruction

在Windows中使用终端时,默认终端不走代理,在使用如git clone或者pip install`等命令时会显示网络无法连接。
可以在Clash中开启TUN Mode后,在终端中(一般是GIT Bash)配置

1
2
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy https://127.0.0.1:7890

其中7890是Clash Port(General 面板内查看)。

Clash on Android

从ClasClashForAndroid的GitHub页面下载对应版本。例如:在Assets中下载cfa-2.5.12-premium-universal-release.apk。正常安装即可。

Proxy on Local Area Network

本小节介绍如何将代理传播到局域网上的其他机器,比如局域网服务器。

Start Clash

在局域网内一台机器上启动启Clash,打开System Proxy 和 Allow LAN 按钮。

Configure proxychains

在需要使用代理的机器上,例如:一台Ubuntu服务器的用户目录下创建.proxychains,并配置proxychains.conf文件。

1
2
3
4
5
mkdir -p ~/.proxychains # 创建文件夹
cd ~/.proxychains
touch proxychains.conf # 使用touch创建文件
vim proxychains.conf # 或者 vim
gedit proxychains.conf # 或者 gedit

在创建的proxychains.conf文件中写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# proxychains.conf  VER 3.1
#
# HTTP, SOCKS4, SOCKS5 tunneling proxifier with DNS.
#

# The option below identifies how the ProxyList is treated.
# only one option should be uncommented at time,
# otherwise the last appearing option will be accepted
#
#dynamic_chain
#
# Dynamic - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped)
# otherwise EINTR is returned to the app
#
strict_chain
#
# Strict - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# all proxies must be online to play in chain
# otherwise EINTR is returned to the app
#
#random_chain
#
# Random - Each connection will be done via random proxy
# (or proxy chain, see chain_len) from the list.
# this option is good to test your IDS :)

# Make sense only if random_chain
#chain_len = 2

# Quiet mode (no output from library)
#quiet_mode

# Proxy DNS requests - no leak for DNS data
proxy_dns

# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000

# ProxyList format
# type host port [user pass]
# (values separated by 'tab' or 'blank')
#
#
# Examples:
#
# socks5 192.168.67.78 1080 lamer secret
# http 192.168.89.3 8080 justu hidden
# socks4 192.168.1.49 1080
# http 192.168.39.93 8080
#
#
# proxy types: http, socks4, socks5
# ( auth types supported: "basic"-http "user/pass"-socks )
#
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5 ip clash-port

将最后一行的ip和clash-port替换为开启Clash的机器的局域网IP和Clash Port(General面板内的第一行),使用时需要开启Allow LAN。

Usage

在需要使用代理的命令前添加proxychains,例如:使用pip下载某opencv-python包:

1
proxychains pip instal opencv-python

Hello World

Posted on 2023-03-03

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

23 posts
9 categories
39 tags
GitHub E-Mail
© 2025 Lixuan Zhang
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4