Windows11下大模型环境报错 OSError: CUDA_HOME environment variable is not set | AI快速入门 2024

错误现象:OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
解决办法:

  • 下载CUDA12.4
  • 解压安装,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4
  • 配置环境变量,CUDA_HOME=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4
  • 进入python虚拟环境执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    pip install --no-build-isolation -e .

    --no-build-isolation:
    这个选项告诉pip在构建包时不要使用隔离环境。默认情况下,pip在构建包时会创建一个隔离环境,这意味着构建过程中不会访问系统的全局Python环境。
    使用这个选项可以让构建过程访问当前环境中的其他包,这对于依赖于当前环境中的特定库或版本的情况非常有用。

    -e:
    这个选项表示“editable”模式,即以可编辑的方式安装包。这意味着安装的包可以在不重新安装的情况下直接修改源代码,并且这些修改会立即生效。
    这对于开发阶段特别有用,因为你可以随时修改代码并测试更改的效果,而不需要每次都重新安装包。

参考文章:
OSError: CUDA_HOME environment variable is not set.

Apache2编译configure的时候报错 pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/

从Github PCRE2仓库 下载PCRE代码编译安装后,再进行Apache的编译即可解决问题。

1
2
3
4
5
6
7
8
9
10
# cd /usr/local/src
# wget -O pcre2-10.44.tar.gz https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz
# tar xvzf pcre2-10.44.tar.gz
# cd pcre2-10.44
# ./configure
# make
# make install

# cd /usr/local/src/httpd-2.4.62
# ./configure --prefix=/usr/local/apache2

Apache的access log日志中有很多internal dummy connection

Apache HTTP Server 管理子进程时,需要一种方法来唤醒正在侦听新连接的进程。
为此,它会向自身发送一个简单的 HTTP 请求。该请求将出现在access_log 文件中,地址为环回接口(如果配置了 IPv6,则通常为 127.0.0.1 或 ::1),内容:internal dummy connection。
在非 SSL 服务器上,可能会看到每个httpd子进程最多有一个此类请求。
这些请求是完全正常的,如果想从日志中排除,可以按照下面的方法忽略。

1
2
SetEnvIf Remote_Addr "127\.0\.0\.1" loopback
# 添加env=!loopback到 CustomLog 指令的末尾

RHEL9访问的时候报错:userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]

一直以来使用的密钥无法访问新启动RHEL9的服务器,提示ssh-rsa的不在系统所接受的算法中(PubkeyAcceptedAlgorithms)。
由于RHEL9系列的系统,已经禁用了不再安全的算法(ssh-rsa)可以用下面的方法临时解决。
不过还是推荐使用rsa-sha2-256 或者 rsa-sha2-512的签名算法。

1
2
3
$ vi /etc/ssh/sshd_config
PubkeyAcceptedAlgorithms +ssh-rsa
$ sudo systemctl restart sshd

Apache+php-fpm报错提示:Service Unavailable 错误日志:Permission denied

npm run dev启动服务后,访问报错:failed: Connection refused”

1
2
3
$ tail /etc/httpd/logs/error_log
[proxy:error] [pid 121] (13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
[proxy_fcgi:error] [pid 121] [client 172.17.0.1:61486] AH01079: failed to make connection to backend: httpd-UDS

调查后发现需要修配置php-fpm的配置文件,修改监听模式和acl配置。

1
2
3
4
5
6
7
8
9
10
$ vi php-fpm.conf
...
;listen.mode = 0660
# 修改为
listen.mode = 0666
...
listen.acl_users = apache,nginx
# 修改为
;listen.acl_users = apache,nginx
$ systemctl restart php-fpm.service

MySQL bin log占用太多磁盘空间

可以用下面的方法调整bin log的过期时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. MySQL命令修改运行参数
> show global variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
> set global expire_logs_days = 3;
> show global variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 3 |
+------------------+-------+

# 2. 修改配置文件持久化配置,下次重启MySQL反映。
$ vi /etc/my.cnf
expire_logs_days = 3

PPT转PDF转PNG图片 | Python | comtypes | pdf2image | poppler

业务上需要把PPT转换成PNG图片,使用comtypes先转换成pdf,然后pdf2image加poppler按页转换PNG。

环境加依赖库的准备

1
2
3
4
5
6
7
Python 3.12.4
python -m pip install comtypes
python -m pip install pdf2image
poppler
# 下载地址 https://github.com/oschwartz10612/poppler-windows/releases/
# 安装后配置路径到环境变量Path中,验证工作正常
poppler -v

转换代码

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
import comtypes.client
from pdf2image import convert_from_path
import os

def init_powerpoint():
powerpoint = comtypes.client.CreateObject("Powerpoint.Application", dynamic=True)
powerpoint.Visible = 1
return powerpoint

def ppt_to_pdf(powerpoint, inputFileName, outputFileName, formatType=32):
if outputFileName[-3:] != 'pdf':
outputFileName = outputFileName + ".pdf"
deck = powerpoint.Presentations.Open(inputFileName)
deck.SaveAs(outputFileName, formatType)
deck.Close()

def pdf_to_img(inputFileName):
images = convert_from_path(inputFileName)
for index, image in enumerate(images):
image.save(f'{inputFileName}-{index}.png')

def convert_ppt_to_pdf(powerpoint, folder):
files = os.listdir(folder)
pptfiles = [f for f in files if f.endswith((".ppt", ".pptx"))]
for pptfile in pptfiles:
fullpath = os.path.join(folder, pptfile)
ppt_to_pdf(powerpoint, fullpath, fullpath)

def convert_pdf_to_img(folder):
files = os.listdir(folder)
pdffiles = [f for f in files if f.endswith((".pdf"))]
for pdffile in pdffiles:
fullpath = os.path.join(folder, pdffile)
pdf_to_img(fullpath)

if __name__ == "__main__":
powerpoint = init_powerpoint()
cwd = os.getcwd()
convert_ppt_to_pdf(powerpoint, cwd)
convert_pdf_to_img(cwd)
powerpoint.Quit()

‘POINTER(IUnknown)’ object has no attribute ‘Presentations’错误解决

1
2
3
4
5
6
    deck = powerpoint.Presentations.Open(inputFileName)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'POINTER(IUnknown)' object has no attribute 'Presentations'

# 初始化powerpoint对象时加上 dynamic=True
powerpoint = comtypes.client.CreateObject("Powerpoint.Application", dynamic=True)

参考文章

batch-ppt-to-pdf
Python实现ppt转pdf代码报错