NumpyConcatenate加速

NumpyConcatenate加速

多次循环进行 Numpy Concentrate 操作后,当原始数组变得过大的时,单步处理时间会逐渐变长,处理大量数据的时候时间成本极高。

解决思路

这里简单的讲一下问题的定位过程,通过装饰器 Check 每个函数的执行时间,重点关注执行时长逐渐变长的部分。

1
2
3
4
5
6
7
8
9
10
11
from time import time

def timer(func):
def func_wrapper(*args, **kwargs):
time_start = time()
result = func(*args, **kwargs)
time_end = time()
res = time_end - time_start
print("{} cost time: {} s".format(func.__name__, res))
return result
return func_wrapper

就会发现当 np.Concatenate 导致 Array 很大之后,运行就会逐渐减缓。由于运行缓慢是由于对大数组操作导致的,因此这里考虑将大数组切分成多个小数组,然后再最后进行合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with open(file, 'r') as rf:
for line in rf:
...
new_row_array = ...
key = ...
if len(res_list[key][-1]) == 0 :
res_list[key][-1] = new_row_array
else:
if len(res_list[key][-1]) >= MAX_LENGTH:
res_list[key].append(new_row_array)
else:
res_list[key][-1] = np.concatenate([
res_list[key][-1], new_row_array
])
for i in range(len(res_list)):
res_list[i] = np.concatenate(res_list[i], axis=0)

可以看上述这段代码,通过对-1 的使用,来自动的切分 Array,最后再整体合并,这样就能避免每个数组过大的问题。

本地实验测试也成功,将原本耗时 400s 的处理过程减少到了 30s

Fi


树莓派02 家用服务器

树莓派02 家用服务器

树莓派家庭服务器的搭建以 docker 为核心,通过 docker 统一管理家庭服务,目前搭建的服务还在持续完善中,主要目的是为了方便日常使用、满足学习和探索的需求。

Docker 的安装这里不再赘述,参考 Docker Configuration01 Install on Linux 一文进行安装即可;本篇主要侧重于介绍部署的镜像和服务,以及简单介绍使用方式。

一些 Docker 容器推荐

这里推荐一些 Docker 容器:Alist、XiaoYa、PiDashboard、redis、mysql、portainer、memos、wikijs

相关的 Docker-Compose 文件会上传到AikenH/aikenh-DockerComposeYML (github.com)

数据库部署与远程连接测试

sqlite 3

Sqlite 与 Mysql 等不同,是一个无服务器、零配置的数据库,其更像是一个解析特定数据库文件的命令接口(CLI 工具),其将数据完全存储于一个单一的跨平台磁盘文件中;

由于 sqlite3 的特性,决定了其是一个轻量级不需要额外配置的数据库,但是在远程访问方面,只能通过文件共享来实现远程操作数据库。

大多数的 Linux 系统版本都会附带 SQLite 的安装,因此我们可以直接使用下面的指令验证一下是否安装:

1
sqlite3

如果没有安装的话,可以去官方的下载页面下载对应的预编译包,然后进行安装即可。

1
2
3
4
5
6
wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz
tar -zxvf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000
./configure --prefix=/usr/local
make
make install

这里也提供使用 Docker-compose 安装的方式,但实际上看该数据库的特性,用 docker 安装的并不是推荐的选择。

参考资料:SQLite 3 Docker Compose – Mustafa Bugra

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'

services:
sqlite3:
container_name: sqlite3_container
image: nouchka/sqlite3:latest
stdin_open: true
tty: true
volumes:
#Modify following line
- path-to/your/databases/sqlite3:/root/db/
ports:
- '9000:9000' # expose ports - HOST:CONTAINER
restart: unless-stopped

如果是树莓派的 ARM64,可能需要使用另一个镜像

1
docker run --rm -it -v "$(pwd):/workspace" -w /workspace keinos/sqlite3

但是该镜像的使用方式,实际上就是将其当成一个命令来用,所以还是建议本机安装。


树莓派01 家庭影音中心

树莓派01 家庭影音中心

将 RaspBerry Pi 4B 作为家庭影视中心/机顶盒的核心就是 KODI 软件,这是考虑到以下的几点:遥控器的控制、对挂载 webdav 和其他的支持

最方便的方式可以选择以 KODI 为核心的两个 OS:LibreELEC、OSMC(推荐),这两个系统以 KODI 为默认启动,同时也支持远程登录和 Docker 部署等 Linux 的功能。后者更为推荐应该是前者的官方改进版本。

考虑到后续可能会将该 SD 卡用于其他用处,因此本文选择的是使用 RaspBerryPi OS 的方案,以下围绕该方案进行展开:

RaspBerry Pi OS+Kodi+Alist 方案探究

可以参考 trouble shooting,可以发现实际上安装 kodi 最简单的方式就是直接使用 apt,无需做其他的 PPA 添加。

安装Kodi

1
sudo apt-get install kodi

安装完后,使用 kodi 命令开启或者在开始菜单的软件中心中选择 kodi 打开。

设置 GPU 显存(硬解相关)

首先做一下固件的升级

1
sudo rpi-update

然后调整一下显存:系统设置里面将 gpu_mem 调高一些,我使用的是 4G,调整到了 256MB,切记不要调整太高,否则可能会开机失败,重启后查看显存是否设置成功。

查看 GPU 显存的方式:

1
vcgencmd get_mem arm && vcgencmd get_mem gpu

最后在 kodi 中查看相关的选项的开关情况:

参考资料:树莓派RaspberryPi 4B设置显存开启硬件加速 支持Emby|Plex|JellyFin转码 LiuJason’sBlog


Clash局域网代理共享

Clash局域网代理共享

本文介绍基于 Windows Clash Desktop 的代理服务器设置,可以为局域网内的设备提供代理服务,该方案可以解决一定的科学上网需求,但是没办法覆盖所有的场景,例如 PS5 的 Netflix ,其不走代理服务器,因此无法通过该方案解决,(软路由可破)

本篇的设置内容主要会从两个方面出发:一个是服务器的开启和防火墙的设置、另一个是客户端如何设置使用对应的代理服务器。

Clash开启代理服务器

Clash 作为局域网代理服务器开启的方式十分简单,主要是以下几步。

开启局域网访问 -> 设置端口,查看 ip -> 防火墙允许通行

配置代理服务器

开启局域网访问: Allow LAN 打钩即可。
端口:设置好想要的 mixport 即可。

image.png

防火墙允许通行: 防火墙-> 高级设置,找到 Clash 所有项,允许其在专用网络上通行。

image.png
查看 ip:命令行输入 ipconfig/ all 里面的 WLAN 模块,可以找到自己的局域网 ip

image.png


Docker Configuration01 Install on Linux

Docker Configuration01 Install on Linux

不同于 Docker 在 Windows 端借助 Desktop 可视化进行安装和配置,Linux 端没有默认的 Desktop 界面,因此会额外安装 portainer 作为我们 docker 的 Dashboard.

Install Docker on Ubuntu

该部分完全转载自官方的安装指引,如果流程需要更新的时候可以移步官网检查,此外官网还包含了其他几种安装方式,这里就不介绍,这里只介绍基于 apt 的安装方式。

设置 apt 的 repo

1 更新 apt 的索引,同时通过下载包来允许 Apt 基于 http 来索引仓库

1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

2 安装 docker 官方的 GPG 秘钥

1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

3 配置对应的 repository

1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

完成上述设置之后,就可以开始安装 Docker 了。


树莓派00 组装和亮机篇

树莓派00 组装和亮机篇

最近入手了树莓派 4B,打算基于树莓派做一些有趣&有用的项目,该系列笔记来记录个人树莓派学习和开发的历程。

连载确认!该系列文章将会从装机开始,介绍树莓派用于以下几个项目的开发和部署过程:

  • [x] 基于 Docker 的家庭服务器
  • [x] 智能家居控制中枢
  • [x] 影音中心 & 电视机顶盒
  • [ ] 物联网 or AI 的衍生应用实践

本篇首先介绍亮机和开发环境设置过程,包含:组装、系统安装、远程开发环境设置(SSH、XRDP)

树莓派组装

树莓派组装上比较防呆接口,唯一需要注意的是散热块和风扇的安装:

  • 在 CPU 和缓存等模块上装上散热片
  • 风扇的固定位置在外壳上,接线如下图所示
  • SD 卡的安装位置在背面

微信图片_20230626091027.jpg

系统安装

该部分仅介绍我使用的系统安装和烧录软件,系统的选择需要根据自己所拥有的设备,以及目的去选择。

硬件准备:SD 卡,读卡器,一台正常运行的 PC,可外接的屏幕。


Terminal multiplexer Zellij

Terminal multiplexer Zellij

Tmux 作为一款优秀的终端复用器,前面已经介绍过,这里在介绍一款有着相同功能的平替,个人认为 zellij 的 UI 各方面的设计,使得其相比于 Tmux 有着更低的入门难度,也避免了需要记大量快捷键,因此这里介绍一下该工具。

Zellij 是一款终端复用器,有什么功能可以完全参考 Tmux ,还支持了许多有趣的特性和自定义 Layout 等功能(可能后续用到的话会完善该部分笔记),详细的可以参考官网的介绍,接下来就简单的介绍一下安装和一些自定义的 Alias。

Install 安装

Zellij 是基于 Rust 编写,因此在安装之前需要安装 rust 和 cargo(类似 rust 的包管理器),安装可以参考 Rust 官方网站(推荐) | The Cargo Book | Rust Wiki CN

官方网站中介绍了 WSL 的安装指令如下:

1
2
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
#--proto以及--tlsvl在Linux或者Macos安装的时候可以忽略

安装完成后可以使用如下命令,基于 Cargo 安装 zellij:

1
cargo install --locked zellij

如果出现了问题也可以尝试先更新 rust

1
rustup update

AIGC05 Stable Diffusion Model Training

AIGC05 Stable Diffusion Model Training

该章节主要介绍 Stable-Diffusion 中模型的训练,考虑到硬件条件的限制,实际上这里介绍的训练,都是针对大模型的各种微调技术(Lora,Dreambooth,HyperNetwork, …),这里会以 LoRA 模型的训练为主。

参考文献:

Train LoRA

LoRA 的优势就是其模型更小,且更加模块化;也就是说其的训练成本和要求都更低,同时使用代价小,可以作为某种风格插件或者角色插件来使用。

image.png

其中蓝色的是预训练好的源网络,而橙色的是新加的网络,通过控制 R 的宽度(文章主要论证了大模型的参数可能存在较低维度的秩,因此可以使用较小的 R 来对大模型的参数造成有效的影响),可以有效的减少需要训练的网络的 Size。

事前准备

这里只介绍本地训练,训练也可以在 Colab Notebook 等在线训练集群中进行,这里就不进行介绍了

  1. WebUI + 想训练的基础 SD 模型
  2. .txt 带说明的文本文件
  3. Training Repo(sd-scriptlora-script
  4. 数据集准备(准备好训练图像)

训练包准备

这里我们使用 lora-script 来进行模型训练,lora-script 实际上是 sd-script 之外在包了一层,新增了一些可视化的功能和一些其他的脚本,让 sd-script 更加易用,它调用 sd 中的脚本来实现训练,但是封装了一些注释和整理,此外还支持的 tensorboard 可视化。

sd-script 本身包含了训练 lora、dreambooth、text-embedding、UNet、Text Encoder、图像生成、模型转换等多种功能。lora-script 还是主要专注于 LoRA 训练

查看 repo 也能知道 lora-script 中包含了 sd-script,所以我们部署的时候只需

1
git clone --recurse-submodules https://github.com/Akegarasu/lora-scripts

即可将需要的库安装下来,然后安装环境和相关以来只需要执行 .\install.ps1 即可(该脚本有 cn 版本,但是可能会出现问题),其会安装 sd-scripts 和 lora-scripts 需要的库。具体的可以参考相关 repo(sd-script 详细说明,lora-script 有简化版说明)。

安装的时候可能会出现虚拟环境未激活的问题,我们可以提前在改目录执行一次 python -m venv venv 一次即可。

Finish.


Docker-App 1 Backup Photos by Immich

Docker-App 1 Backup Photos by Immich

手机到电脑端的图像备份和预览往往是一个大问题,特别是当多个手机要备份的时候,说难不难,但说简单也确实有很多麻烦的地方,因此我推荐 Immich 的解决方案。

Immich 是一个基于个人开发者开发的开源 Github 项目,immich-app/immich,该解决方案有以下的一些优势:

  • 移动端支持:移动端实现便于手机的随时和自动同步;
  • 多用户支持:多用户的权限管理、分割、以及用户间的相册共享;
  • Live 格式支持:支持各种原生格式存储,

Self-hosted photo and video backup solution directly from your mobile phone.

因此我本人推荐按照以下的方式来使用:针对家庭等环境,多用户部署在 NAS 或者某台 PC 上,可以长期或者定期的启动备份服务,然后就可以将手机中的照片空间释放掉。由此可以实现:

  1. 通过共享文件夹共建家庭相册;
  2. 权限分割个人相册;
  3. 定期/自动备份手机中的照片,并清理对应的存储空间;

Windows App01 Potplayer & Alist

Windows App01 Potplayer & Alist

本篇主要介绍一下播放器 PotPlayer 的设置以及结合 Alist&小雅 alist 的使用,这样就可以直接在播放器访问本地网盘上的内容,便于使用和观看。

Alist Deploy

Alist 作为一个网盘管理中心,可以将各大网盘中的资源进行统一管理,同时支持视频的 webdav 播放,这里推荐的安装方式是使用 Docker-Compose 进行安装,根据自己的情况来选择对应的挂载和安装目录。

由于官方的文档已经事无巨细,这里就不在赘述如何安装和配置 alist 的各个网盘挂载,详情参见:Home | AList Docs (nn.ci)

安装完并启动 Alist 服务即可,记住自己的端口和设置的账号密码

Aria2离线下载支持

该部分介绍如何通过 docker 为 Alist 添加 Aria2 作为离线下载服务,以及一些常见的问题解决方法。

参考资料:aria2-pro | aira2-pro-github | aria2认证失败

这里介绍使用 docker-compose 安装 aria2的方法,并将 docker 版本的 aria2和 alist 结合起来使用,在基于 docker 安装之前,我们先准备几个文件夹:

1
2
cd <your-path-2-aria2> && mkdir aria2-config && chmod 777 aria2-config
mkdir aria2-downloads && chmod 777 aria2-downloads

其中 downloads 目录是我们用来下载文件的目录,我们也可以使用挂载的目录或者共享的目录来存储下载的文件;然后我们准备一下 alist 中用于离线下载的目录,该目录需要在 alist 的 docker 和 aria2的 docker 中都将该 volume 挂载到同一个地方

本文将 aria2的队名目录挂载到 alist 的对应目录中,对应的 alist 的 compose 文件有

image.png

而 aria2的 compose 文件则有:

image.png

再将该目录的权限改成777,chmod 777 <this-dir> 之后即可再 alist 中离线下载成功,而且该下载文件会在指定的网盘中上传,当上传完成时会删除临时文件,不占用本地磁盘空间。

完整的 Compose 文件可以参考 Aria2-Pro-Docker/docker-compose.yml at master · P3TERX/Aria2-Pro-Docker · GitHub 官方的配置进行安装,我个人的 compose 文件则会上传到AikenH/aikenh-DockerComposeYML (github.com)中。

Aria2Ng 界面认证失败的问题,是因为我们再 compose 中设置了密码之后,要在该界面的设置中设置密码后才能正常认证。

image.png

密码需要到如下地方设置:

image.png

设置完成后应该就不会有认证失败的提示了。

alist 设置 Aria2失败,由于使用的 docker 部署的 aria2,这里不能使用 localhost,要使用对应的 ip 来设置该服务,如下图所示

image.png

完成这些设置后应该就可以正常使用了,但是由于现在都是网盘场景更多,所以离线下载的可能使用场景也有限,而且通过测试发现,如果完全装在树莓派上的话,可能会对系统的性能造成一定的负担。

Xiaoya Deploy

Xiaoya 是基于 Alist 做改版的个人资源站,里面涵盖了大量的影视资源,并在不断的更新,通过在本地挂载 xiaoya 我们也可以用来通过 webdav 在播放器中直接选择视频进行播放,大多数情况下都免去了找资源的痛苦。

官方网站:主页 | 小雅的分类 Alist (xiaoya.pro)

拥有了 Docker 环境后,就可以基于 xiaoya 提供的脚本实现一键拉取镜像和启动 Docker,默认的端口是 5678,安装指令如下:

1
sudo bash -c "$(curl -s http://docker.xiaoya.pro/update_new.sh)"

安装过程中会需要填入如下内容:token、open_token、转存目录的 folder id,具体和后续更新参考配置页,(跟随安装引导界面进行安装即可。)