普通视图

发现新文章,点击刷新页面。
昨天以前若绾

Quilibrium Node 基础搭建教程

作者 Royc30ne
2024年3月6日 19:57

Created by Royc30ne. Thanks Demipoet's initial version.
最后更新于版本:1.4.5 (Sunset) 2024/3/6


项目官网:Quilibrium
项目简介:Quilibrium 是一种去中心化的互联网层协议,可在不牺牲隐私或可扩展性的情况下提供云计算的舒适性。通过熟悉的 API 兼容 SDK,转向 NoCloud 可能比您想象的要容易得多。

节点运行最低配置要求


在 Dawn 阶段,服务器必须至少有 16GB 内存(最好是 32GB)、250GB 存储空间(最好是固态硬盘)和 50MBps 对称带宽。对于英特尔 / AMD,基准处理器为 3.4GHz 的 Skylake 处理器,具有 12 个专用内核。对于 ARM,可以参考苹果的 M1 系列

安装依赖


更新 apt 源


sudo apt upgrade
sudo apt update

安装 Git


sudo apt install git

安装 GO


目前的版本(截至 1.2.14)不支持使用 go1.21.x 或 go1.19.x 进行项目构建,必须使用 go1.20.x。go 不同版本的安装包可以在这个页面找到: https://go.dev/dl/

这里 1.20.14 为例
下载分发包

wget  https://go.dev/dl/go1.20.14.linux-amd64.tar.gz

解压文件

sudo tar -xvf go1.20.14.linux-amd64.tar.gz 

移动到 usr 目录

sudo  mv  go  /usr/local

删除安装包

sudo  rm  go1.20.14.linux-amd64.tar.gz

将 go 添加到系统环境变量

sudo vim  ~/.bashrc

i 开始在 ~/.bashrc 文件中插入文本
滚动到文件末尾,在末尾的新行中插入以下内容:

GOROOT=/usr/local/go
GOPATH=$HOME/go
PATH=$GOPATH/bin:$GOROOT/bin:$PATH

esc 键停止插入文本模式,输入 :wq然后按键盘上的回车键

运行

source  ~/.bashrc
go version

终端会返回

go version go1.20.14 linux/amd64

配置 Linux 网络设备设置


目的:优化 Q 等网络中典型的大型并行工作的吞吐量(带宽)和延迟。

运行

sudo vim  /etc/sysctl.conf

i 开始在/etc/sysctl.conf文件中插入文本
滚动到文件末尾,在末尾的新行中插入以下内容:

# Increase buffer sizes for better network performance
net.core.rmem_max=600000000
net.core.wmem_max=600000000

esc 键停止插入文本模式,输入 :wq然后按键盘上的回车键

运行

sudo  sysctl  -p

重启让配置生效

reboot

部署 Quilibrium 节点


克隆 Quilibrium CeremonyClient 资源库


运行

cd ~
git  clone  https://github.com/QuilibriumNetwork/ceremonyclient.git

进入 ceremonyclient/node 文件夹

注意:后续所有命令都将在 node/ 文件夹中运行。

cd ceremonyclient/node

导入 voucher hex(可选)


注:仅适用于拥有线下 voucher 的用户,如果您没有凭证,请跳过本节。

运行:

sudo vim /root/voucher.hex

i 开始在 voucher.hex 文件中插入文本
将 228 个字符的凭证十六进制复制粘贴到文件中
esc 键停止插入文本模式,输入 :wq然后按键盘上的回车键

运行:

GOEXPERIMENT=arenas  go  run  ./...  -import-priv-key  `cat /root/voucher.hex`

记下您的 Peer ID。 Peer ID 以后可能会成为您的 Q 钱包。
它将是回复中的最后一行,以 "Qm" 开头,并标有 Peer ID。

初始化 Q 钱包和 .config 文件夹


仅适用于跳过上一个章节的情况,因为您没有线下 voucher,而且您正在安装一个新的 Q 节点。

运行:

cd ~/ceremonyclient/node
GOEXPERIMENT=arenas go run ./...

由于这将触发 Q 节点启动,您现在真正需要的是启动脚本在 ~/ceremonyclient/node 内创建 .config 文件夹,并创建 config.ymlkeys.yml 这两个文件。

一旦看到日志生成,就可以按下 ctl + c暂停节点。

配置网络防火墙


运行:

sudo ufw enable

依次放行 22 8336 443端口

sudo ufw allow 22
sudo ufw allow 8336
sudo ufw allow 443

运行:

sudo ufw status

终端会返回

> To            Action            From
> --            ------            -----
> 22            ALLOW             Anywhere
> 8336          ALLOW             Anywhere
> 443           ALLOW             Anywhere
> 22 (v6)       ALLOW             Anywhere (v6)
> 8336 (v6)     ALLOW             Anywhere (v6)
> 443 (v6)      ALLOW             Anywhere (v6)

配置 config.yml


启用 gRPC 以启用节点的 gRPC 功能调用


注意:该接口为只读接口,未经身份验证,不限制速率。建议仅在通过防火墙适当控制访问或仅通过本地主机查询的情况下启用它们(例如,如果 8337 端口用于 gRPC 调用,最好以后不要在防火墙配置中允许它,而仅在本地主机上触发 gRPC 调用)。

进入 ceremonyclient/node 文件夹:

cd ~/ceremonyclient/node

运行:

sudo vim  .config/config.yml

i 键开始在 config.yml 文件中插入文本
在文件末尾的一行,有一个字段 listenGrpcMultiaddr:"",将其替换为

listenGrpcMultiaddr: /ip4/127.0.0.1/tcp/8337

esc 键停止插入文本模式,输入 :wq然后按键盘上的回车键退出。

通过选择启用统计数据收集


进入 ceremonyclient/node 文件夹:

cd ~/ceremonyclient/node

运行:

sudo vim  .config/config.yml

i 键开始在 config.yml 文件中插入文本
在文件中间部分的一行,有一个engine字段,添加一个名为 statsMultiaddr的子字段

engine:
  statsMultiaddr: "/dns/stats.quilibrium.com/tcp/443"

快速运行节点


所有命令都将在 node/ 文件夹中运行。

cd ~/ceremonyclient/node

启动节点

GOEXPERIMENT=arenas go run ./...

查看 Peer ID

GOEXPERIMENT=arenas go run ./... -peer-id

代币余额

GOEXPERIMENT=arenas go run ./... -balance

进阶配置

TBC

[Linux指南] Linux各发行版防火墙端口放行的方法 Centos | Ubuntu | Debian

2023年3月12日 08:00

Centos#

firewall-cmd --zone=public --add-port={PORT}/tcp --permanent

--zone                #作用域
--add-port=80/tcp     #添加端口,格式:端口/通讯协议
--permanent           #使操作永久生效,没有此参数重启后失效

#例如,要放行HTTP协议的80端口,可以使用以下命令:
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload

Ubuntu#

Ubuntu 默认使用 ufw 防火墙。要放行一个端口,可以使用以下命令:

sudo ufw allow <port>/<protocol>

#例如,要放行HTTP协议的80端口,可以使用以下命令:
sudo ufw allow 80/tcp

Debian#

Debian 默认使用 iptables 防火墙。若系统未预装,可以执行以下命令安装 iptables

apt-get update
apt-get install iptables
apt-get install iptables-persistent

要放行一个端口,可以使用以下命令:


sudo iptables -A INPUT -p <protocol> --dport <port> -j ACCEPT

#例如,要放行HTTP协议的80端口,可以使用以下命令:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

#保存规则(重启后失效)
iptables-save

#保存规则(重启后仍然生效)
netfilter-persistent save
netfilter-persistent reload

#查看当前防火墙规则
iptables -L

Chevereto V4的进阶使用:加入图片审核及儿童色情鉴黄机制

作者 Royc30ne
2023年5月13日 12:46

文章首发于# Chevereto V4 的进阶使用:加入图片审核及儿童色情鉴黄机制, 转载请注明出处。

Chevereto V4 是一个非常出色的图片分享和存储平台,它提供了一个简洁易用的界面和强大的功能。然而,如何确保分享的图片内容的安全性和合法性,是一个严肃的问题。所以,为了能够让各位站长避免自己的图床因为别有用心的人上传一些违反公共道德及法律的图片而收到制裁,我们需要引入一个有效的图片审核及儿童色情内容的鉴黄机制。本篇博客将详细介绍如何在 Chevereto V4 中加入图片审核和儿童色情鉴黄机制。

一、图片审核

  1. 启用图片审核

    首先,我们需要在 Chevereto 的后台管理系统中启用图片审核功能。这可以在设置 -> 图片上传中找到。启用后,所有上传的图片在发布前都需要经过管理员的手动审核。

  2. 图片审核流程

    当用户上传图片后,这些图片将会出现在 "待审核" 的列表中。管理员可以查看这些图片,然后选择通过或者拒绝。如果图片被拒绝,系统将会自动删除该图片,并向上传者发送通知。

二、儿童色情鉴黄机制

对于儿童色情内容的检测,我们需要借助一些 AI 工具,这里我们就可以用到 Chevereto V4 内建由 ModerateContent提供的儿童色情鉴黄 API。

  1. 启用 AI 工具

    ModerateContent 已经提供了 RESTful API,并将其集成到 Chevereto 中。首先,我们需要在这里获取一个免费的 API Key。

  2. 配置检测参数

    然后,在 Chevereto 的后台管理系统中,找到设置 -> 外部服务。

    开启 ModerateContent 并且输入我们刚才获取的 API Key,就大功告成了。

  3. 自动检测流程

    当用户上传图片时,系统会自动调用 AI 工具进行检测。如果检测到儿童色情内容,系统将会自动拒绝该图片,并向上传者发送通知。

注意

ModerateContent 的免费试用每月仅限 10000 张,如果有更多需求的话需要提升到 Pay As You Go。详细的自费可以见如下图示。

小结

通过以上步骤,我们就可以在 Chevereto V4 中加入图片审核和儿童色情鉴黄机制了。这样可以有效地保护用户的权益,防止不适宜的内容传播。然而,这样的机制并不能完全替代人的判断,因此管理员仍然需要定期对系统的判断进行复查。

这是一个复杂但重要的过程,我们必须始终保持警惕,以确保我们的网络空间安全、健康。我们也期待更多的技术和工具能够帮助我们更有效地管理和审核图片内容,实现真正的智能化、自动化。

更多常见问题

1. 如何处理误判的情况?

当 AI 工具误判时,可以通过人工复查来纠正。如果发现某个工具的误判率较高,可以考虑调整其配置参数,或者更换其他更精确的 AI 工具。

2. 如何防止恶意用户反复上传不适宜的图片?

可以在用户管理系统中添加限制,比如上传图片的频率限制、一次上传图片数量的限制等。对于频繁上传不适宜图片的用户,可以进行警告、禁言或者封号等处理。

3. 如果用户对审核结果有异议,应该如何处理?

可以设立一个申诉机制,用户可以通过申诉来反馈他们对审核结果的异议。管理员收到申诉后,应该再次对相关图片进行审查,并给出合理的回复。

Chevereto V4的进阶使用:挂载外部对象存储拓展存储空间

作者 Royc30ne
2023年5月12日 07:34

文章首发于若绾 Chevereto V4 的进阶使用:挂载外部对象存储拓展存储空间,转载请注明出处

在这篇博客文章中,我们将介绍如何在 Chevereto V4 中挂载外部存储对象存储。Chevereto 是一个开源的图像托管和共享系统,它支持各种存储选项,包括本地存储和外部对象存储服务。由于我们的图床往往运行在 VPS 上,在容量不够的时候我们可以通过 S3 对象存储拓展我们图床的存储空间。

前提条件

在开始之前,确保您已经完成了以下步骤:

  1. 已经安装和配置好了 Chevereto V4。(如何安装和配置可以看我之前的这片文章# 教你如何使用 Docker 安装 Chevereto V4 搭建属于自己的图床
  2. 已经有一个外部对象存储服务的账户,例如 Amazon S3、Google Cloud Storage 或者 DigitalOcean Spaces。这里我们以Backblaze为例,相比 Google 这些大厂 Backblaze 价格会更便宜些。

步骤 1: 注册并获取 key

首先,您需要获取您的 S3 对象存储服务的访问信息。这通常包括:

  • 存储服务的 API Endpoint URL
  • Access Key
  • Secret Key

这里以 Backblaze 为例,首先去Backblaze 官网注册好你的账号,注册后会有 10G 的免费存储额度。之后点击My Account进入后台管理界面创建一个新的存储桶。

在创建存储桶的时候在Bucket Unique Name输入一个你喜欢的名字,并且注意第二个选项一定要勾选Public,否则 Chevereto 将无法访问到对象存储中的文件。

下一步就是要创建一个新的 Application Key 以获取刚刚创建 Bucket 的操作以及访问权限。

在创建 Application Key 的时候一定要同时获取写入和读取权限以供 Chevereto 对图像进行操作和访问,因为我们是通过 S3 存储挂载外部存储的,所以我们最好要把Allow List All Bucket Names也勾选上。

20230511234840.webp

创建好后会返回到原来的网页,这里会弹出一个框框,keyIDapplicationKey一定要记住下一步要用,因为如果离开这个网页后将无法返回只能创建一个新的 Application Key。

步骤 2:配置 Chevereto

打开 Chevereto 的管理面板,然后导航到 设置 -> 外部存储。在 外部存储 部分,点击 Add来添加新的外部存储。

在出现的对话框中需要填写以下信息:

  • 存储名称:自定义一个你喜欢的名字。
  • API: 这里我们用的 S3 对象存储,所以就选择 S3 compatible
  • 区域:对象存储的存储区域。
  • Bucket:您想要使用的存储桶名称。
  • Access Key/访问密钥ID:您的存储服务的 Access Key。
  • Secret Key/私有访问ID:您的存储服务的 Secret Key。
  • Endpoint: 存储服务的 Endpoint
  • URL: 存储的 URL

我会告诉大家这些东西都在哪里获取,首先我们之前拿到的keyIDapplicationKey就是对应的Access KeySecret KeyBuceket就是你给 Bucket 取的名字,EndPoint 可以在 Backblaze 的后台看到如下图,区域就是域名的第二段,这里就是us-east-005

URL就是 {https://} + Bucket ID + {EndPoint}, 这里就是 https://Demo-Bucket.s3.us-east-005.backblazeb2.com/

填好这部分就创建成功了,返回后把活动一栏钩上就可以将图片转存到对象存储里面了。

步骤 3:测试配置

完成配置后,您应该在 Chevereto 的 设置 -> 外部存储 部分看到您刚刚添加的存储。你可以上传一张新的图片,并进入相册,如果图片正常显示,那就说明您已经成功地挂载了外部存储对象存储到 Chevereto V4 了!

🎉大功告成

[Linux指南]手把手教你配置Ubuntu下的CUDA、cuDNN环境

作者 Royc30ne
2023年4月11日 10:48

文章首发于若绾 [Linux 指南] 手把手教你配置 Ubuntu 下的 CUDA、cuDNN 环境,转载请注明出处。

导言

作为深度学习和并行计算的核心工具,CUDA(Compute Unified Device Architecture)为 NVIDIA 显卡提供了并行计算的能力。在本教程中,我们将详细介绍如何在 Ubuntu 操作系统下配置 CUDA。本教程以 CUDA 12.1 和 Ubuntu 20.04 为例进行说明,但对于其他版本的 CUDA 和 Ubuntu,配置过程也相差无几。

https://p.v50.tools/images/2023/04/11/cuda-logo.jpeg

安装 CUDA

步骤 1:确认系统兼容性

在配置 CUDA 之前,首先要确保你的系统满足安装要求。以下是需要检查的项目:

  1. 确保你的 GPU 是 NVIDIA GPU,并支持 CUDA 计算能力。可以通过 NVIDIA 官方网站查看支持的 GPU 列表。
  2. 确保你的系统是 64 位的 Ubuntu 操作系统。
  3. 安装 Linux 内核版本在 4.4 及以上的版本。

步骤 2:更新系统软件包

打开终端并输入以下命令更新系统软件包:

sudo apt update
sudo apt upgrade

步骤 3:安装 NVIDIA 显卡驱动

如果你的系统尚未安装 NVIDIA 显卡驱动,可使用以下命令安装:

sudo ubuntu-drivers autoinstall

安装完成后,重启计算机以确保驱动程序正确加载。

步骤 4:下载 CUDA 工具包

前往CUDA ToolKit 官方网站下载相应版本的 CUDA Toolkit,的安装包(以 CUDA 12.1 为例)

https://p.v50.tools/images/2023/04/11/cuda-install.png

步骤 5:安装 CUDA Toolkit

你可以运行以下命令下载并安装 CUDA Toolkit:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-ubuntu2004-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

步骤 6:配置环境变量

为了确保系统能够正确识别 CUDA Toolkit 的安装位置,需要设置环境变量。打开~/.bashrc 文件,添加以下内容:

#打开~/.bashrc
sudo vim ~/.bashrc

#在文末添加下两行并保存关闭
export PATH=/usr/local/cuda-12.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

保存文件并运行以下命令使环境变量生效:

source ~/.bashrc

步骤 7:验证 CUDA 安装

运行以下命令验证 CUDA 是否已正确安装

nvcc --version

如果安装成功,你将看到类似于以下的输出,其中显示了 CUDA 编译器(nvcc)的版本信息:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Tue_Sep_21_19:24:46_PDT_2021
Cuda compilation tools, release 12.1, VXX.X.X
Build cuda_12.1.r12.1/compiler.XX

安装 cuDNN 库(可选)

cuDNN 是一款深度学习框架的 GPU 加速库,支持 TensorFlow、PyTorch 等框架。要安装 cuDNN,请按照以下步骤操作:

https://p.v50.tools/images/2023/04/11/cuDNN-install.png

  1. 前往 NVIDIA 官方网站注册并登录,然后进入cuDNN 下载页面
  2. 选择与你安装的 CUDA 版本兼容的 cuDNN 版本,下载对应的压缩包。
  3. 解压缩下载的文件。假设文件解压缩到了~/Downloads/cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb 目录。
  4. 在终端中运行以下命令安装 cuDNN 库,在置行以下命令之前,您必须将 X.Y 和 8.x.x.x 替换为您特定的 CUDA 和 cuDNN 版本。:
cd ~/Downloads/
sudo dpkg -i cudnn-local-repo-${OS}-8.x.x.x_1.0-1_amd64.deb

#导入GPG key
sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/

#刷新apt源
sudo apt-get update

#安装库
sudo apt-get install libcudnn8=8.x.x.x-1+cudaX.Y
sudo apt-get install libcudnn8-dev=8.x.x.x-1+cudaX.Y
sudo apt-get install libcudnn8-samples=8.x.x.x-1+cudaX.Y

总结

至此,你已经成功配置了 Ubuntu 下的 CUDA 环境。现在,你可以使用 GPU 进行深度学习和高性能计算了。在接下来的工作中,你可能还需要根据实际需求安装和配置深度学习框架,例如 TensorFlow 或 PyTorch。

[纪念碑]再见了Printworks,让我们一同举杯作最后的狂欢

作者 Royc30ne
2023年4月6日 06:26

https://img.v50.tools/images/2023/04/05/IMG_4709.png

我的 PRINTWORKS

今天收到了 Printworks 发来的 Closing Weekend Lineup 邮件,虽然早已听闻 Printworks 即将迎来属于它的重点,但是还是不免有些伤感。怀念起了 2021 年还是疫情时期,我第一次去 Printworks 看 Chemical Brother 的演出,那次也是我真正意义上第一次去 Underground Club 享受电子音乐的洗礼。

今年去 Printworks 看到了 Kx5 的演出,Deadmau5 和 Kaskade 这俩人的组合不过多评价,还好主办方并没有将两位放在一起演出(明智的选择),要不然我猜应该会变成商业大乱炖。Kx5 在 Printworks 是他们这次 Tour 唯一一场在欧洲的演出,其余都是在北美,足以见得 Printworks 在电子音乐届的地位,或许也是主办方想让 Printworks 在它的弥留之际多一点浓墨重彩吧。

大家的 PRINTWORKS

创立背景

Printworks 曾经是一家印刷厂,后来被改建成一个融合了现代艺术和音乐文化的地标性场馆。多年以来,这里举办了许多大型音乐活动,成为了音乐爱好者心中的圣地。

音乐盛事

在 Printworks 的舞台上,无数优秀的艺术家纷纷登场,为观众带来了一场又一场精彩绝伦的音乐盛宴。这里曾举办过各类音乐节、演唱会以及现场表演,展现了音乐的无穷魅力。

影响和荣誉

作为全球知名的音乐场馆之一,Printworks 在各大音乐颁奖典礼上屡获殊荣,展示了其独特的影响力。这里孕育出了许多音乐传奇,也成为了全球音乐迷的圣地。在DJMag 的排行榜中,Printworks 几乎一直处于前五。并且成文了新蝙蝠侠的取景地之一,没错蝙蝠侠中的反派的夜总会正是现实世界的 Printworks(在看电影的时候发现怎么这么像 Printworks,于是 google 了一下发现果真如此)。

最后的狂欢:代表告别的音乐盛宴

https://img.v50.tools/images/2023/04/05/Screenshot-2023-04-05-at-22.30.02.png

Printworks,作为伦敦市中心的一个多功能活动场地,曾是众多音乐爱好者聚集的地方。然而,随着疫情的持续影响和限制,Printworks 宣布将关闭其现有的场地,并举办最后一场音乐盛宴。

这个消息让许多人感到失落,因为 Printworks 不仅是一个音乐场所,而且还是一个充满活力和创意的社区,吸引了来自世界各地的艺术家、音乐家和创意人才。在六年的时间里,我们共同见证了从 Techno 到 Melodic House,从 Disco 到 Bass 等多种音乐风格的蓬勃发展。

但是,Printworks 不会黯然离去。相反,它将以另一种方式继续存在,并为音乐爱好者提供更多精彩的体验。因此,我们应该为 Printworks 的过去和未来举杯祝福,并一同参加最后的狂欢。

演出阵容

告别音乐盛宴的演出阵容强大,包括了众多知名音乐制作人,他们将用音乐为 Printworks 画上一个圆满的句号。同时,这次活动也为新晋艺人提供了展示才华的机会,以崭新的面貌迎接音乐产业的新篇章。

首场演出将与 BBC Radio 1 Dance 合作,带来 Black Coffee 期待已久的 Printworks 首秀。

周六的演出将探索电子音乐的旋律之美,阵容包括 Camelphat、Stephan Bodzin [live]、Mind Against 等。

系列演出的第三场将专为贝斯音乐爱好者准备,包括 Sub Focus & Dimension & MC ID、Kings Of The Rollers & Inja 等。此外,还将有一位特别嘉宾即将公布。

在周一的银行假日,将举行一个跨足多种电子音乐风格的庆典,演出阵容包括 Peggy Gou、Róisín Murphy [Live]、Folamour、Dixon、TSHA、HAAi、DJ Koze、SHERELLE 和 I. JORDAN。

Printworks 音乐遗产的延续

新生代音乐活动

尽管 Printworks 即将谢幕,但它的音乐遗产将延续在一代又一代的音乐活动中。未来,我们将看到更多创新性的音乐盛事,以新的形式诠释 Printworks 所代表的音乐精神。

音乐产业的未来

随着科技的发展,音乐产业正面临着巨大的变革。虚拟现实、人工智能等前沿技术将对音乐产业产生深刻影响,为音乐创作和表演带来全新的可能。

回顾 Printworks 的辉煌历程

在告别 Printworks 之际,让我们回顾一下它的辉煌历程。这里见证了音乐的繁荣与发展,为全球音乐迷带来了无数美好的回忆。虽然 Printworks 即将落幕,但它的音乐遗产将永远留存。

新兴音乐节的崛起

在 Printworks 的遗产影响下,未来将诞生更多富有创意和特色的音乐节。这些新兴音乐节将以其独特的艺术表现和精彩的现场氛围,成为全球音乐迷的新欢。

全球范围内,越来越多的音乐节活动正在涌现。从美洲到亚洲,从欧洲到非洲,音乐节已经成为了人们享受音乐的重要载体。随着新一轮音乐产业的蓬勃发展,我们有理由相信,未来的音乐盛宴将更加精彩纷呈。

告别

通过回顾 Printworks 的辉煌历程和展望音乐产业的未来,我们对音乐产业充满了期待。在 Printworks 即将谢幕之际,让我们共同举杯,以最后的狂欢告别这片音乐圣地。尽管道别总是伤感,但音乐永不止步,我们将继续迎接音乐的新篇章。

让我们在最后一次聚会中畅享音乐,跳舞,唱歌,一同度过难忘的时光。让我们一同举杯,感谢 Printworks 为我们带来的无限欢乐和灵感,祝福它在新的旅程中继续发光发热!

让我们在 Closing Weekend 再见!

[NumPy技巧]机器学习中使用numpy对数据集进行保存以集中管理

作者 Royc30ne
2023年4月4日 22:27

https://images.unsplash.com/photo-1646583288948-24548aedffd8?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb
文章首发于若绾

摘要

在机器学习中,数据是至关重要的。因此,对于任何机器学习项目,对数据的管理和处理都是必不可少的。数据管理涉及到许多方面,包括数据的收集、清理、存储和处理。在这篇文章中,我们将讨论如何使用 NumPy 来保存数据集以供集中管理。

使用 NumPy 保存数据集

NumPy 是一种用于科学计算的 Python 库。它提供了一个强大的多维数组对象,以及一系列用于处理这些数组的函数。NumPy 数组可以存储不同类型的数据,包括数字、字符串和布尔值。因此,它们是存储数据集的理想选择。

保存单个数组

如果你的数据集中只有一个数组,我们可以使用 NumPy 的save函数。

numpy.save

函数变量:

file: file, str, or pathlib.Path

数据被保存到的文件或文件名。如果文件是一个文件对象,那么文件名将不会改变。如果文件是一个字符串或路径,如果文件名还没有扩展名,那么将在文件名上添加一个.npy扩展名。

arr: array_like

要保存的阵列数据。

allow_pickle: bool, optional

允许使用 Python pickles 来保存对象数组。不允许 pickle 的原因包括安全性 (加载 pickle 的数据可以执行任意代码) 和可移植性 (pickle 的对象可能无法在不同的 Python 安装上加载,例如,如果存储的对象需要的库不可用,而且不是所有 pickle 的数据都能在 Python 2 和 Python 3 之间兼容)。默认值: True

fix_imports: bool, optional

只有在强迫 Python 3 上对象数组中的对象以 Python 2 兼容的方式被 pickle 时才有用。如果 fix_imports 为 True,pickle 将尝试把新的 Python 3 名称映射到 Python 2 中使用的旧模块名称,这样 pickle 的数据流就可以用 Python 2 读取。

例如,假设我们有一个名为data的 NumPy 数组,我们可以使用以下代码将其保存到名为data.npy的文件中:

import numpy as np

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.save('data.npy', data)

从文件中加载数组

要加载数据集,我们可以使用 NumPy 的load函数。例如,以下代码加载了名为data.npy的文件中保存的数组:

import numpy as np

data = np.load('data.npy')
print(data)

输出将是:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

同时保存多个数组

如果你的数据集中具有多个数组,像 trani_set, train_label, test_set, test_label。可以使用 NumPy 的savez或者savez_compressed函数对数据集进行保存。**numpy.savez将多个数组保存为未压缩的.npz文件,而numpy.savez_compressed将数组保存为压缩的.npz** 文件,可以节省存储空间。

numpy.savez

函数变量:

file: str or file

文件名(str)或一个打开的文件(file-like object),数据将被保存在那里。如果文件是一个字符串或一个路径,如果文件名中没有.npz扩展名,将被附加到文件名中.

args: Arguments, optional

要保存到文件中的数组。请使用关键字参数(见下面的 kwds)来给数组指定名称。作为 args 指定的数组将被命名为 "arr_0"、"arr_1",以此类推。

kwds: Keyword arguments, optional

要保存到文件的数组。每个数组将以其相应的关键字名称保存到输出文件中。

kwds,数组将以关键字的名称保存。在这个例子中,我们创建了两个 NumPy 数组array1array2,然后使用numpy.savez将它们保存到名arrays.npz** 的文件中。需要注意的是,我们需要为每个数组指定一个关键字参数,该参数将作为数组在文件中的名称。

import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

# 保存数组到文件
np.savez('arrays.npz', arr1=array1, arr2=array2)

numpy.savez_compressed

函数变量:

file: str or file

文件名(str)或一个打开的文件(file-like object),数据将被保存在那里。如果文件是一个字符串或一个路径,如果文件名中没有.npz扩展名,将被附加到文件名中。

args: Arguments, optional

要保存到文件中的数组。请使用关键字参数(见下面的 kwds)来给数组指定名称。作为 args 指定的数组将被命名为 "arr_0"、"arr_1",以此类推。

kwds: Keyword arguments, optional

要保存到文件的数组。每个数组将以其相应的关键字名称保存到输出文件中。

这个例子与上一个类似,但使用了 **numpy.savez_compressed将数组保存为压缩的.npz** 文件。

import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])

# 保存数组到压缩文件
np.savez_compressed('compressed_arrays.npz', arr1=array1, arr2=array2)

从文件中加载数组

要从 **.npz文件中加载数组,可以使用numpy.load** 函数:

import numpy as np

# 加载保存的数组
loaded_arrays = np.load('arrays.npz')

# 通过在文件中指定的名称访问数组
loaded_array1 = loaded_arrays['arr1']
loaded_array2 = loaded_arrays['arr2']

在这个例子中,我们使用 **numpy.load加载了名为arrays.npz的文件,并通过之前指定的名称访问其中的数组。同样的方法也适用于加载压缩的.npz** 文件。

小结

在本文中,我们讨论了如何使用 NumPy 来保存数据集以供集中管理。这是一个重要的数据管理方面,应该在任何机器学习项目中得到充分的重视。

[联邦学习]Krum算法:深入解析及代码实现

作者 Royc30ne
2023年3月29日 03:05

修订:算法原理中有原理讲解距离和有描述不清的地方(2023/4/4)

在本篇文章中,我们将深入探讨联邦学习领域的一种重要算法 ——Krum 算法。本文将介绍联邦学习的基本概念、Krum 算法的原理、其在实际场景中的应用以及优势与不足。

论文原文:Machine Learning with Adversaries: Byzantine Tolerant Gradient Descent

联邦学习简介

联邦学习(Federated Learning)是一种分布式机器学习方法,允许多个参与者在保护数据隐私的前提下共同训练一个共享的机器学习模型。与传统的集中式学习相比,联邦学习的优势在于数据可以在本地存储和计算,减轻了数据中心的负担,同时保护了用户隐私。想要了解更多关于联邦学习的介绍,可以查看我的这篇文章。

[联邦学习] 联邦学习概念及常见算法总结|聚合算法|防御算法|攻击算法 - 若绾

Krum 算法简介

Krum 算法是一种联邦学习中的鲁棒聚合方法,用于防止恶意攻击者通过操纵本地模型权重来影响全局模型。该算法由 Blanchard 等人于 2017 年首次提出,具有很强的鲁棒性,可以抵御拜占庭攻击。

https://img.v50.tools/images/2023/03/28/krum-figure.png

Krum 算法原理

Krum 算法的核心思想是在每轮训练结束后,对参与者的本地模型权重进行一种特殊的排序和选择。具体来说,Krum 算法遵循以下步骤:

  1. 计算模型权重之间的距离:对于每对参与者 i 和 j,计算其本地模型权重向量之间的欧氏距离。
  2. 计算每个参与者的距离和:一共有 n 个参与者,对于每个参与者 i,假设有 f 个攻击者,计算参与者与其他最近的 n-f-1 个参与者模型权重之间的距离和。
  3. 选择距离和最小的模型:在所有参与者中,找到距离和最小的模型作为聚合模型。

通过这种方法,Krum 算法能够在参与者之间建立一种 “共识”,过滤掉可能受到恶意攻击的异常模型权重,从而保护全局模型的鲁棒性。

Krum 的简单代码实现

为了帮助您更好地理解 Krum 算法,我们将提供一个简单的 Python 代码实现。假设我们已经获得了来自多个参与者的本地模型权重。下面是 Krum 算法的实现步骤:

import numpy as np

def euclidean_distance(x, y):
    return np.linalg.norm(x - y)

def krum(weights, n_attackers):
    num_clients = len(weights)
    dist_matrix = np.zeros((num_clients, num_clients))

    # 计算权重之间的距离
    for i in range(num_clients):
        for j in range(i + 1, num_clients):
            dist = euclidean_distance(weights[i], weights[j])
            dist_matrix[i, j] = dist
            dist_matrix[j, i] = dist

    # 计算每个参与者的距离和,并选择距离和最小的模型
    min_sum_dist = float('inf')
    selected_index = -1
    for i in range(num_clients):
        sorted_indices = np.argsort(dist_matrix[i])
        sum_dist = np.sum(dist_matrix[i, sorted_indices[1:(num_clients - n_attackers)]])
        if sum_dist < min_sum_dist:
            min_sum_dist = sum_dist
            selected_index = i

    return weights[selected_index]

# 示例:5个参与者的本地模型权重
local_weights = [
    np.array([1.0, 2.0, 3.0]),
    np.array([1.1, 2.1, 3.1]),
    np.array([0.9, 1.9, 2.9]),
    np.array([5.0, 6.0, 7.0]),
    np.array([5.1, 6.1, 7.1])
]

n_attackers = 1
aggregated_weight = krum(local_weights, n_attackers)
print("Aggregated weight:", aggregated_weight)

在这个例子中,我们有 5 个参与者的本地模型权重。我们假设存在 1 个拜占庭攻击者。我们使用 Krum 算法找到最佳的聚合权重。

请注意,这个实现仅用于演示目的,可能不适用于实际生产环境。在实际应用中,您可能需要考虑通信、同步和其他并行计算方面的问题。

Krum 算法的应用场景

Krum 算法适用于以下场景:

  • 需要保护用户隐私的联邦学习场景:例如,在医疗、金融等领域,数据隐私和安全性至关重要。
  • 面临拜占庭攻击风险的联邦学习场景:例如,在 IoT(物联网)设备、自动驾驶汽车等分布式系统中,由于通信不稳定、设备故障或恶意攻击,可能存在传输错误或篡改的模型权重。

Krum 算法的优势与不足

优势:

  • 鲁棒性:Krum 算法可以抵御一定数量的拜占庭攻击者,保证全局模型的鲁棒性。
  • 适用性广泛:Krum 算法可以应用于各种类型的联邦学习场景,包括横向联邦学习、纵向联邦学习等。

不足:

  • 计算复杂度较高:Krum 算法需要计算每对参与者之间的距离,计算复杂度为 O (n^2),其中 n 为参与者数量。在参与者数量较多的情况下,计算负担可能较重。
  • 通信开销较大:Krum 算法需要在参与者之间传输模型权重和距离信息,可能导致较大的通信开销。在网络带宽有限或通信不稳定的环境中,可能影响联邦学习的效率。

总结

Krum 算法是联邦学习中的一种重要鲁棒聚合方法,能够抵御拜占庭攻击,保护全局模型的鲁棒性。尽管它在计算复杂度和通信开销方面存在一定的不足,但它在保护数据隐私、确保模型安全性方面具有巨大的潜力。随着分布式机器学习和隐私保护需求的不断增长,Krum 算法及其相关研究将在未来发挥重要作用。

[机器学习]K-means算法详解:原理、优缺点、代码实现、变体及实际应用

作者 Royc30ne
2023年3月24日 08:00

K-means 算法是一种非常流行的无监督学习方法,主要应用于聚类问题。本篇博客将详细介绍 K-means 算法的原理、优缺点及实际应用场景。

算法原理

K-means 算法的核心思想是将数据划分为 K 个独立的簇 (cluster),使得每个簇内的数据点距离尽可能小,而簇与簇之间的距离尽可能大。下面是 K-means 算法的具体步骤:

  1. 初始化:选择 K 个数据点作为初始质心(centroid),这些质心可以是随机选择的,也可以是通过其他方法选定的。

  2. 分配:将每个数据点分配到离它最近的质心所代表的簇中。

  3. 更新:重新计算每个簇的质心,方法是将簇内所有数据点的均值作为新的质心。

  4. 重复步骤 2 和 3,直到质心不再发生显著变化或达到迭代次数上限。

优点

K-means 算法具有以下优点:

  1. 简单易懂:K-means 算法的步骤简单,容易理解和实现。

  2. 计算效率高:K-means 算法的时间复杂度相对较低,适用于大规模数据集。

  3. 可扩展性强:K-means 算法可以通过各种改进和优化应用于不同类型的数据和问题。

缺点

K-means 算法也存在一些局限性:

  1. 需要预先指定 K 值:在实际应用中,选定合适的 K 值可能需要尝试多种方法。

  2. 对初始质心敏感:算法的结果可能受到初始质心选择的影响,导致局部最优解。

  3. 对噪声和离群点敏感:K-means 算法容易受到噪声和离群点的影响,可能导致簇划分不准确。

  4. 对簇形状和大小敏感:K-means 算法假设簇是凸的和大小相似的,对于其他形状和大小的簇可能效果不佳。

代码实现

下面是使用 Python 和 NumPy 实现 K-means 算法的简单示例:

import numpy as np

def initialize_centroids(data, k):
    # 从数据集中随机选择k个点作为初始质心
    centroids = data[np.random.choice(data.shape[0], k, replace=False)]
    return centroids

def assign_clusters(data, centroids):
    # 计算数据点与质心之间的距离,并将数据点分配给最近的质心
    distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)
    cluster_labels = np.argmin(distances, axis=1)
    return cluster_labels

def update_centroids(data, cluster_labels, k):
    # 计算每个簇的新质心,即簇内数据点的均值
    new_centroids = np.array([data[cluster_labels == i].mean(axis=0) for i in range(k)])
    return new_centroids

def kmeans(data, k, max_iterations=100, tol=1e-4):
    # 初始化质心
    centroids = initialize_centroids(data, k)
    
    for _ in range(max_iterations):
        # 分配簇
        cluster_labels = assign_clusters(data, centroids)
        
        # 更新质心
        new_centroids = update_centroids(data, cluster_labels, k)
        
        # 检查收敛条件
        if np.linalg.norm(new_centroids - centroids) < tol:
            break
        
        centroids = new_centroids
    
    return centroids, cluster_labels

# 示例:使用K-means算法对随机生成的数据进行聚类
np.random.seed(42)
data = np.random.rand(300, 2)  # 生成300个二维数据点

k = 3  # 聚类数量
centroids, cluster_labels = kmeans(data, k)

print("Centroids:\n", centroids)
print("Cluster Labels:\n", cluster_labels)

请注意,这是一个简化的实现,仅用于演示 K-means 算法的基本原理。在实际应用中,建议使用成熟的机器学习库,如 scikit-learn,以获得更稳定、高效的实现和额外的功能。

改进方法及变体

针对 K-means 算法的局限性,有以下改进方法:

  1. 选择合适的 K 值:可以尝试不同的 K 值,通过轮廓系数(Silhouette Coefficient)、肘部法则(Elbow Method)等方法评估聚类效果,选择最佳的 K 值。

  2. 优化初始质心选择:使用 K-means++ 算法改进初始质心选择,降低算法收敛到局部最优解的风险。

  3. 增量式 K-means:对于大规模数据集,可以采用增量式 K-means 算法进行分布式计算,提高计算效率。

  4. 引入核函数:将 K-means 算法扩展为 Kernel K-means 算法,使用核函数将数据映射到高维空间,处理非线性可分的数据。

K-means++

K-means++ 是一种改进的 K-means 算法,主要针对初始质心选择的问题。K-means++ 的优势在于能够选择更好的初始质心,从而提高算法的收敛速度,降低陷入局部最优解的风险。K-means++ 的初始质心选择步骤如下:

  1. 从数据集中随机选择一个点作为第一个质心。

  2. 对于数据集中的每个点,计算它与当前已选择质心的最近距离。

  3. 以距离的平方作为权重,按照概率分布随机选择下一个质心。

  4. 重复步骤 2 和 3,直到选择了 K 个质心。

  5. 使用选定的初始质心运行 K-means 算法。

增量式 K-means

增量式 K-means(Incremental K-means)也称为在线 K-means,是针对大规模数据集的一种改进算法。与传统的 K-means 算法不同,增量式 K-means 每次只处理一个数据点,不断更新质心,而不是一次性处理整个数据集。这种方法适用于分布式计算和大规模数据集,可以大大提高计算效率。增量式 K-means 的主要步骤如下:

  1. 初始化 K 个质心。

  2. 遍历数据集,对每个数据点执行以下操作:

    • 计算该点与当前质心的最近距离,将其分配到最近的簇。

    • 更新被分配到的簇的质心。

  3. 重复步骤 2,直到质心稳定或达到迭代次数上限。

Kernel K-means

Kernel K-means 是一种基于核方法的 K-means 算法,可以处理非线性可分的数据。核方法通过将数据映射到高维特征空间,使得原本在低维空间中不可分的数据在高维空间中变得线性可分。Kernel K-means 的主要步骤如下:

  1. 选择合适的核函数(如 RBF 核、多项式核等)和参数。

  2. 将数据集映射到高维特征空间。

  3. 在高维特征空间中执行 K-means 算法。

  4. 将聚类结果投影回原始数据空间。

Kernel K-means 可以处理复杂的数据结构,但计算复杂度相对较高,可能不适合大规模数据集。在实际应用中,可以根据问题的特点选择合适的 K-means 算法变体。

应用场景

K-means 算法广泛应用于各个领域,如:

  1. 图像分割:将图像中的像素聚类为 K 个簇,可以实现图像分割和简化。

  2. 文档聚类:将文档按照内容相似度进行聚类,有助于文档分类、信息检索和推荐系统。

  3. 客户细分:将客户按照购买行为、兴趣爱好等特征进行聚类,有助于企业针对不同群体制定个性化的营销策略。

  4. 异常检测:通过聚类,可以发现数据中的离群点或异常点,进而进行异常检测或数据清洗。

  5. 降维:K-means 算法可以与主成分分析(PCA)等降维技术结合,实现数据降维和可视化。

[服务器赚钱系列] Traffmonetizer:利用你的服务器闲置带宽赚钱

作者 Royc30ne
2023年3月18日 08:00

摘要

之前个大家介绍了一个项目 Peer2Profit 并且介绍了如何通过挂载 Peer2Profit 来给自己的服务器回回血,今天要给大家介绍一个类似的新项目 ——Traffmonetizer, 也是利用你的闲置带宽来赚钱的项目。

https://www.royc30ne.com/peer2profit-vps-earning/

介绍

Traffmonetizer是一个让你利用闲置的网络流量赚钱的平台。只要你安装了 Traffmonetizer 的应用程序,就可以把你的设备连接到一个全球性的网络,为各种市场调查和数据收集提供服务。这些服务包括网站可用性测试、广告验证、流媒体内容传输、解除地域限制和网页抓取等。

Traffmonetizer 不会影响你正常上网或使用设备,也不会泄露你的个人信息或隐私。它只会使用你设备上一小部分空闲的网络流量,并通过加密和匿名化技术来保证安全性和透明度。

和国内的 pcdn 有所区别,这种项目其实看重你 ip 的价值而不是流量。相比 Peer2Profit 小编实测收益会更低一些,但是他俩可以同时挂载也不影响收益多一个渠道何乐而不为呢?大家可以从这个官网注册账号,接下来小编会教大家如何挂载和使用它。

如何挂载 Traffmonetizer

Traffmonetizer 的使用方法非常简单,只需四个步骤:

  1. 注册 Traffmonetizer 的账户并获取一个访问令牌。

  2. 在你的设备上安装 Traffmonetizer 的应用程序,支持 Windows, Android, MacOS 和 Docker Hub。

  3. Traffmonetizer 会使用你设备上一小部分空闲网络流量来完成任务,并保证不影响你正常上网。

  4. 通过你的账户仪表板来跟踪你提供的流量和赚取的收入。你可以随时提现到你的 PayPal 或其他支付方式。

注册登陆 Traffmonetizer 以后可以在 dashboard 中获取你的 token

traff-dashboard.png

获取到 token 以后就可以在右边下载对应平台的软件了,这边我主要介绍一下如何通过 Docker 来实现挂载,不知道如何安装 docker 的可以看我之前 Peer2Profit 的文章。这里是 Traffmonetizer 的 docker 主页。

首先在命令行把对应版本的 Docker Image Pull 下来

AMD64:
docker pull traffmonetizer/cli:latest

ARM64:
docker pull traffmonetizer/cli:arm64v8

ARM32:
docker pull traffmonetizer/cli:arm32v7

运行 docker 应用,在这里要用到你之前在官网获取到的 token

docker run -d --name tm traffmonetizer/cli start accept --token {TOKEN} --device-name {取一个设备的昵称,不需要可以不加--device-name}

过几分钟你就可以在官网后台 Stats 看到你的设备已经接入网络开始盈利了

traff-status.png

小结

Traffmonetizer 是一个安全、透明、高效和有趣的赚钱方式。你可以随时开启或关闭应用程序,也可以设置每天提供多少流量。总之,Traffmonetizer 是一个让你利用闲置网络流量赚钱的平台,它不需要你投入太多时间或精力,只要安装应用程序就可以开始收益。如果你想尝试一下这种新颖而又简单的赚钱方式,请点击下面的链接注册并下载 Traffmonetizer 吧!

点我呀!

❌
❌