阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技

news2024/12/24 20:04:57

阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技

  • 一、ubuntu22.04基本环境配置
      • 1.1 更换清华Ubuntu镜像源
      • 1.2 更新包列表:
      • 2. 安装英伟达显卡驱动
          • 2.1 使用wget在命令行下载驱动包
          • 2.2 更新软件列表和安装必要软件、依赖
          • 2.2 卸载原有驱动
          • 2.3 安装驱动
          • 2.4 安装CUDA
          • 2.5 环境变量配置
  • 二、安装miniconda环境
      • 1. 下载miniconda3
      • 2. 安装miniconda3
      • 3. 切换到bin文件夹
      • 4. 输入pwd获取路径
      • 5. 打开用户环境编辑页面
      • 6. 重新加载用户环境变量
      • 7. 初始化conda
      • 8.验证是否安装成功
      • 9.conda配置
  • 三、安装Qwen2-Audio
      • 1.克隆仓库
          • 1.1 github克隆
          • 1.2 国内github镜像克隆
          • 1.3. 进入目录
      • 2.创建虚拟环境
          • 2.1 进入虚拟环境
      • 3. 安装依赖
          • 3.1设置清华源、更新pip
          • 3.2安装torch 12.4cuda版本
          • 3.3安装依赖文件
          • 3.4安装webui界面及其他未安装依赖
          • 3.5安装魔搭库准备下载模型文件:
          • 3.6下载相关模型
          • 3.7执行代码,启动webui界面
          • 3.8加入声音驱动,实现真正的语音聊天
  • 四、成功实现语音交互
        • 4.1 找不到录音机问题

一、ubuntu22.04基本环境配置

1.1 更换清华Ubuntu镜像源

  • 删除原来的文件
rm /etc/apt/sources.list
  • 开始编辑新文件
vim /etc/apt/sources.list
  • 先按i键,粘贴以下内容
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

请添加图片描述

  • 确保内容跟上述图片一致

  • 按esc键,再输入冒号+wq保存

在这里插入图片描述

1.2 更新包列表:

  • 打开终端,输入以下命令:
sudo apt-get update
sudo apt upgrade
  • 更新时间较长,请耐心等待

在这里插入图片描述

2. 安装英伟达显卡驱动

2.1 使用wget在命令行下载驱动包
wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.100/NVIDIA-Linux-x86_64-550.100.run

在这里插入图片描述

2.2 更新软件列表和安装必要软件、依赖
sudo apt-get install g++

在这里插入图片描述

在这里插入图片描述
点击回车enter即可
在这里插入图片描述

sudo apt-get install gcc

在这里插入图片描述

sudo apt-get install make

在这里插入图片描述
在这里插入图片描述
点击回车enter即可

成功安装

在这里插入图片描述

2.2 卸载原有驱动
sudo apt-get remove --purge nvidia* 

在这里插入图片描述

  • 1.使用vim修改配置文件
sudo vim /etc/modprobe.d/blacklist.conf
  • 2.按i键进入编辑模式,在文件尾增加两行:
blacklist nouveau
options nouveau modeset=0

在这里插入图片描述

  • 3.按esc键退出编辑模式,输入:wq保存并退出

  • 4.更新文件

sudo update-initramfs -u

这里等待时间较久

在这里插入图片描述

  • 5.重启电脑:
sudo reboot

这里需要等一会才能连上

2.3 安装驱动
  • 1.授予执行权限
sudo chmod 777 NVIDIA-Linux-x86_64-550.100.run
  • 2.执行安装命令
sudo ./NVIDIA-Linux-x86_64-550.100.run

在这里插入图片描述

在这里插入图片描述

这里一直按回车就行,默认选择

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一直按回车enter键,直到安装成功

在这里插入图片描述

在这里插入图片描述

  • 3.检测显卡驱动是否安装成功
nvidia-smi

在这里插入图片描述

2.4 安装CUDA
wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run

在这里插入图片描述

执行安装命令

sudo sh ./cuda_12.4.0_550.54.14_linux.run
  • 1.输出accept开始安装

在这里插入图片描述

  • 2.然后注意这里要按enter取消勾选第一个选项,因为之前已经安装了驱动

在这里插入图片描述

  • 3.接着选择Install开始安装

在这里插入图片描述

  • 4.安装完成

在这里插入图片描述

2.5 环境变量配置
  • 1.以vim方式打开配置文件
sudo vim ~/.bashrc
  • 2.按i键进入编辑模式,在文件尾增加下面内容:
export PATH="/usr/local/cuda-12.4/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH"

在这里插入图片描述

  • 按esc键退出编辑模式,输入:wq保存并退出

  • 3.更新环境变量

source ~/.bashrc
  • 4.检测CUDA是否安装成功
nvcc -V

在这里插入图片描述

二、安装miniconda环境

1. 下载miniconda3

wget https://mirrors.cqupt.edu.cn/anaconda/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh

在这里插入图片描述

2. 安装miniconda3

bash Miniconda3-py310_23.10.0-1-Linux-x86_64.sh -u

在这里插入图片描述

直接一直enter键,到输入路径和yes

这边建议路径为:miniconda3

在这里插入图片描述

直接回车enter即可,再次输入yes

在这里插入图片描述

成功安装

在这里插入图片描述

3. 切换到bin文件夹

cd miniconda3/bin/

4. 输入pwd获取路径

pwd

复制这里的路径

5. 打开用户环境编辑页面

vim ~/.bashrc 
  • 点击键盘I键进入编辑模式,在最下方输入以下代码
export PATH="/root/miniconda3/bin:$PATH"

在这里插入图片描述

按esc键退出编辑模式,输入:wq保存并退出

6. 重新加载用户环境变量

source ~/.bashrc

在这里插入图片描述

7. 初始化conda

conda init bash

在这里插入图片描述

8.验证是否安装成功

conda -V

在这里插入图片描述

9.conda配置

  • 1.配置清华镜像源

    代码如下:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

在这里插入图片描述

  • 2.设置搜索时显示通道地址
conda config --set show_channel_urls yes

在这里插入图片描述

  • 3.配置pip 镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

三、安装Qwen2-Audio

1.克隆仓库

1.1 github克隆
git clone https://github.com/QwenLM/Qwen2-Audio.git
1.2 国内github镜像克隆
git clone https://mirror.ghproxy.com/https://github.com/QwenLM/Qwen2-Audio.git
1.3. 进入目录
cd Qwen2-Audio/

2.创建虚拟环境

conda create -n qwen2 python=3.10

在这里插入图片描述

  • 输入y回车即可
2.1 进入虚拟环境
conda activate qwen2

在这里插入图片描述

3. 安装依赖

3.1设置清华源、更新pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

python -m pip install --upgrade pip
3.2安装torch 12.4cuda版本
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

在这里插入图片描述

3.3安装依赖文件
cd demo
pip install -r requirements_web_demo.txt
3.4安装webui界面及其他未安装依赖
pip install librosa
pip install --upgrade "accelerate>=0.21.0"
pip install django
pip install git+https://mirror.ghproxy.com/https://github.com/huggingface/transformers
3.5安装魔搭库准备下载模型文件:
pip install modelscope
3.6下载相关模型
cd ..
modelscope download --model qwen/qwen2-audio-7b-instruct --local_dir './Qwen/Qwen2-Audio-7B-Instruct'
3.7执行代码,启动webui界面
  • 改端口
vim demo/web_demo_audio.py

按i进行编辑,完成后再按esc,冒号,wq退出

在这里插入图片描述

  • 成功进入

在这里插入图片描述

3.8加入声音驱动,实现真正的语音聊天
cd demo
  • 创建一个新的webui界面的文件
touch test_audio.py
vim test_audio.py

输入以下内容

import gradio as gr
import modelscope_studio as mgr
import librosa
from transformers import AutoProcessor, Qwen2AudioForConditionalGeneration
from argparse import ArgumentParser
import requests
import os
from django.http import HttpResponse

# 默认的模型检查点路径
DEFAULT_CKPT_PATH = 'Qwen/Qwen2-Audio-7B-Instruct'

def text_to_speech(text2):
    data = {
        "text": text2,
        "text_language": "zh",
    }
    # 注意 URL 中的单引号应该是 URL 的一部分,需要正确转义
    response = requests.post('http://服务器IP:端口', json=data)
    
    if response.status_code == 200:
        audio_file_path = "/root/project/Qwen2-Audio/demo/output.mp3"
        with open(audio_file_path, "wb") as f:
            f.write(response.content)
        return audio_file_path
    else:
        print(f"错误:请求失败,状态码为 {response.status_code}")
        return None

def _get_args():
    """
    解析命令行参数,获取运行配置。

    返回:
        argparse.Namespace: 包含命令行参数的命名空间对象。
    """
    parser = ArgumentParser()
    parser.add_argument("-c", "--checkpoint-path", type=str, default=DEFAULT_CKPT_PATH,
                        help="Checkpoint name or path, default to %(default)r")  # 模型检查点路径
    parser.add_argument("--cpu-only", action="store_true", help="Run demo with CPU only")  # 是否仅使用CPU
    parser.add_argument("--inbrowser", action="store_true", default=False,
                        help="Automatically launch the interface in a new tab on the default browser.")  # 是否在浏览器中自动打开界面
    parser.add_argument("--server-port", type=int, default=15110,
                        help="Demo server port.")  # 指定服务器端口
    parser.add_argument("--server-name", type=str, default="0.0.0.0",
                        help="Demo server name.")  # 指定服务器名称

    args = parser.parse_args()
    return args

def add_text(chatbot, task_history, input):
    """
    将用户输入的文本内容添加到聊天记录中,并更新聊天机器人界面。

    参数:
        chatbot (gr.components.Chatbot): 聊天机器人组件。
        task_history (list): 任务历史记录。
        input (gr.inputs): 用户输入内容。

    返回:
        tuple: 更新后的聊天机器人界面和任务历史记录,以及重置后的用户输入框。
    """
    text_content = input.text  # 获取文本输入内容
    content = []
    if len(input.files) > 0:  # 如果用户上传了音频文件
        for i in input.files:
            content.append({'type': 'audio', 'audio_url': i.path})  # 将音频文件添加到内容列表中
    if text_content:  # 如果用户输入了文本
        content.append({'type': 'text', 'text': text_content})  # 将文本内容添加到内容列表中
    task_history.append({"role": "user", "content": content})  # 更新任务历史记录

    # 更新聊天机器人界面,添加用户输入
    chatbot.append([{
        "text": input.text,
        "files": input.files,
    }, None])
    return chatbot, task_history, None
'''
def add_file(chatbot, task_history, audio_file_path):
    """
    将音频文件添加到聊天记录中。

    参数:
        chatbot (gr.components.Chatbot): 聊天机器人组件。
        task_history (list): 任务历史记录。
        audio_file_path (str): 音频文件的路径。

    返回:
        tuple: 更新后的聊天机器人界面和任务历史记录。
    """
    # 确保任务历史记录中的音频条目是正确的格式
    task_history.append({"role": "user", "content": [{"type": "audio", "audio_url": audio_file_path}]})
    
    # 更新聊天记录,直接使用 audio_file_path 而不是 gr.Audio 组件
    chatbot.append((None, {"type": "audio", "audio_url": audio_file_path}))

    return chatbot, task_history
'''
import os

def add_file(chatbot, task_history, audio_path):
    if not os.path.isfile(audio_path):
        print(f"Error: The file {audio_path} does not exist.")
        return chatbot, task_history

    # 将音频文件信息添加到任务历史
    task_history.append({
        "role": "user",
        "content": [{"type": "audio", "audio_url": audio_path}]
    })

    # 假设 chatbot 组件可以接受字典格式的输入
    chatbot_state = [{
        "text": f"[Audio file: {os.path.basename(audio_path)}]",
        "files": [audio_path]  # 直接使用文件路径而不是 gr.File
    }, None]
    chatbot.append(chatbot_state)  # 更新 chatbot 状态

    return chatbot, task_history

def reset_user_input():
    """
    重置用户输入字段。

    返回:
        gr.update: 将文本框的值重置为空。
    """
    return gr.Textbox.update(value='')

def reset_state(task_history):
    """
    重置聊天记录和任务历史。

    参数:
        task_history (list): 当前的任务历史记录。

    返回:
        tuple: 清空的聊天记录和任务历史。
    """
    return [], []

def regenerate(chatbot, task_history):
    """
    重新生成最后的机器人响应。

    参数:
        chatbot (gr.components.Chatbot): 聊天机器人组件。
        task_history (list): 任务历史记录。

    返回:
        tuple: 更新后的聊天机器人界面和任务历史记录。
    """
    # 如果最后一条消息是助手生成的,则移除它
    if task_history and task_history[-1]['role'] == 'assistant':
        task_history.pop()
        chatbot.pop()
    # 如果任务历史记录不为空,重新生成响应
    if task_history:
        chatbot, task_history = predict(chatbot, task_history)
    return chatbot, task_history

def predict(chatbot, task_history):
    """
    根据当前任务历史记录生成模型响应,并将响应转换为音频文件添加到聊天记录中。

    参数:
        chatbot (gr.components.Chatbot): 聊天机器人组件。
        task_history (list): 任务历史记录。

    返回:
        tuple: 更新后的聊天机器人界面和任务历史记录。
    """
    print(f"{task_history=}")
    print(f"{chatbot=}")

    # 使用处理器将任务历史记录格式化为模型输入
    text = processor.apply_chat_template(task_history, add_generation_prompt=True, tokenize=False)
    audios = []

    # 遍历任务历史,查找音频内容并加载
    for message in task_history:
        if isinstance(message["content"], list):
            for ele in message["content"]:
                if ele["type"] == "audio":
                    audios.append(
                        librosa.load(ele['audio_url'], sr=processor.feature_extractor.sampling_rate)[0]
                    )

    if len(audios) == 0:  # 如果没有音频,则设置为 None
        audios = None
    print(f"{text=}")
    print(f"{audios=}")

    # 使用处理器生成模型输入
    inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True)
    if not _get_args().cpu_only:  # 如果支持 GPU,则将输入数据移动到 CUDA 设备
        inputs["input_ids"] = inputs.input_ids.to("cuda")

    # 生成响应
    generate_ids = model.generate(**inputs, max_length=256)
    generate_ids = generate_ids[:, inputs.input_ids.size(1):]

    # 解码生成的文本响应
    # 假设其他参数已经正确设置
    response = processor.batch_decode(generate_ids, skip_special_tokens=True)[0]
    task_history.append({'role': 'assistant', 'content': response})
    chatbot.append((None, response))  # 添加文本响应

    # 将文本响应转换为语音
    audio_file_path = text_to_speech(response)
    if audio_file_path:
        chatbot, task_history = add_file(chatbot, task_history, audio_file_path)

    return chatbot, task_history

def _launch_demo(args):
    """
    启动Gradio的Web用户界面,展示Qwen2-Audio-Instruct模型的聊天功能。

    参数:
        args (argparse.Namespace): 从命令行解析的参数。
    """
    with gr.Blocks() as demo:
        # 添加页面标题和描述
        gr.Markdown(
            """<p align="center"><img src="https://qianwen-res.oss-cn-beijing.aliyuncs.com/assets/blog/qwenaudio/qwen2audio_logo.png" style="height: 80px"/><p>""")
        gr.Markdown("""<center><font size=8>Qwen2-Audio-Instruct Bot</center>""")
        gr.Markdown(
            """\
    <center><font size=3>This WebUI is based on Qwen2-Audio-Instruct, developed by Alibaba Cloud. \
    (本WebUI基于Qwen2-Audio-Instruct打造,实现聊天机器人功能。)</center>""")
        gr.Markdown("""\
    <center><font size=4>Qwen2-Audio <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B">🤖 </a> 
    | <a href="https://huggingface.co/Qwen/Qwen2-Audio-7B">🤗</a>&nbsp | 
    Qwen2-Audio-Instruct <a href="https://modelscope.cn/models/qwen/Qwen2-Audio-7B-Instruct">🤖 </a> | 
    <a href="https://huggingface.co/Qwen/Qwen2-Audio-7B-Instruct">🤗</a>&nbsp | 
    &nbsp<a href="https://github.com/QwenLM/Qwen2-Audio">Github</a></center>""")
        
        # 创建聊天机器人组件
        chatbot = mgr.Chatbot(label='Qwen2-Audio-7B-Instruct', elem_classes="control-height", height=750)

        # 创建用户输入组件,支持文本、麦克风和文件上传
        user_input = mgr.MultimodalInput(
            interactive=True,
            sources=['microphone', 'upload'],
            submit_button_props=dict(value="🚀 Submit (发送)"),
            upload_button_props=dict(value="📁 Upload (上传文件)", show_progress=True),
        )
        task_history = gr.State([])  # 初始化任务历史状态

        with gr.Row():  # 创建清除历史和重试按钮
            empty_bin = gr.Button("🧹 Clear History (清除历史)")
            regen_btn = gr.Button("🤔️ Regenerate (重试)")

        # 当用户提交输入时,调用add_text函数,然后调用predict函数生成响应
        user_input.submit(fn=add_text,
                          inputs=[chatbot, task_history, user_input],
                          outputs=[chatbot, task_history, user_input]).then(
            predict, [chatbot, task_history], [chatbot, task_history], show_progress=True
        )
        # 清除历史按钮的点击事件处理,重置聊天记录和任务历史
        empty_bin.click(reset_state, outputs=[chatbot, task_history], show_progress=True)
        # 重试按钮的点击事件处理,重新生成最后的响应
        regen_btn.click(regenerate, [chatbot, task_history], [chatbot, task_history], show_progress=True)

    # 启动Gradio界面
    demo.queue().launch(
        share=False,  # 不共享URL
        inbrowser=args.inbrowser,  # 是否自动在浏览器中打开
        server_port=args.server_port,  # 指定服务器端口
        server_name=args.server_name,  # 指定服务器名称
        ssl_certfile="/root/project/cert.pem", 
        ssl_keyfile="/root/project/key.pem", 
        ssl_verify=False
    )

if __name__ == "__main__":
    args = _get_args()  # 获取命令行参数
    if args.cpu_only:
        device_map = "cpu"  # 如果指定了仅使用CPU,设置设备映射为CPU
    else:
        device_map = "auto"  # 否则自动选择设备

    # 加载模型
    model = Qwen2AudioForConditionalGeneration.from_pretrained(
        args.checkpoint_path,
        torch_dtype="auto",  # 自动选择数据类型
        device_map=device_map,  # 设置设备映射
        resume_download=True,  # 断点续传
    ).eval()
    model.generation_config.max_new_tokens = 2048  # 设置最大生成token数,用于长对话
    print("generation_config", model.generation_config)
    processor = AutoProcessor.from_pretrained(args.checkpoint_path, resume_download=True)  # 加载处理器
    _launch_demo(args)  # 启动演示界面

  • 运行上面代码之前先到4.1配置ssl

四、成功实现语音交互

在这里插入图片描述

4.1 找不到录音机问题
  • 创建ssl
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes

一直按enter键默认选择即可

  • 修改launch
vim demo/web_demo_audio.py

加入ssl参数,注意替换路径

demo.queue().launch(
        share=False,  # 不共享URL
        inbrowser=args.inbrowser,  # 是否自动在浏览器中打开
        server_port=args.server_port,  # 指定服务器端口
        server_name=args.server_name,  # 指定服务器名称
        ssl_certfile="/root/project/cert.pem", 
        ssl_keyfile="/root/project/key.pem", 
        ssl_verify=False
    )

在这里插入图片描述

  • 注意用https访问
https://服务器ip:端口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA学习之知识补充(下)

六&#xff1a;File类与IO流&#xff1a; 这里给出三种常见的初始化方法&#xff1a; 通过文件路径初始化: File file new File("C:/example/test.txt");这种方法用于创建一个文件对象&#xff0c;该文件对象表示指定路径的文件或目录。例如&#xff1a;File fil…

Zookeeper服务注册及心跳机制详解

ZooKeeper提供了一种类似于文件目录的结构来保存key值&#xff0c;其提供了四种key类型&#xff0c;分别是持久节点&#xff0c;临时节点&#xff0c;持久有序节点&#xff0c;临时有序节点。其中临时节点的特性是当创建此节点的会话断开时&#xff0c;节点也会被删除。这一特性…

xss.function靶场(easy)

文章目录 第一关Ma Spaghet!第二关Jefff第三关Ugandan Knuckles第四关Ricardo Milos第五关Ah Thats Hawt第六关Ligma第七关Mafia第八关Ok, Boomer 网址&#xff1a;https://xss.pwnfunction.com/ 第一关Ma Spaghet! 源码 <!-- Challenge --> <h2 id"spaghet&qu…

一文掌握 Web 测试:功能、界面、兼容与安全的综合测试指南!

随着Web技术的不断演进&#xff0c;测试除了对应用的功能性、界面美观性、跨平台兼容性的基本要求外、安全性和性能的要求也逐步增高。因此&#xff0c;全面、系统的测试思维和策略成为了保证Web应用高质量的关键因素。本篇文章将从功能测试、界面测试、兼容性测试和安全测试四…

AI歌手-五月天(声音转换)

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

JavaScript - 数组对象中实用好玩的reduce方法

JavaScript中reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)&#xff0c;将其结果汇总为单个返回值。 语法&#xff1a; arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) 参数配置&#xff1a; 参数名描述cal…

系列:水果甜度个人手持设备检测-github等开源库和方案

系列:水果甜度个人手持设备检测 -- github等开源库和方案 概述 通常来说&#xff0c;年纪轻轻的我们一般都喜欢走捷径&#xff0c;对于智能设备和算法软件领域来说&#xff0c;GitHub应该算为数不多的的捷径之一。就算因为效果不好/知识产权/方向不同等原因不用&#xff0c;…

XML外部实体注入

1.DTD实体及引用 DTD(文档类型定义)是一种用于定义XML文档结构和元素约束的方法。它可以描述一个XML文档的元素、属性、实体、注释等&#xff0c;从而规定了文档的结构和语法规则。DTD 通常是一个单独的文件&#xff0c;可以被多个XML文档所共享。 而在DTD中&#xff0c;实体…

日志分析-Windows

目录 Windows事件日志场景 1&#xff08;问题 1&#xff09;&#xff1a;服务器管理员向管理层提出了大量关于 PowerShell 在环境中被阻止的投诉。管理层最终批准在环境中使用 PowerShell。查看哪些日志、监控哪些事件 ID 等。场景 2&#xff08;问题 2&#xff09;&#xff1a…

Ubuntu 24.04系统部署Zabbix7.0

1、Ubuntu 24.04系统 阿里云镜像下载地址&#xff1a; https://mirrors.aliyun.com/ubuntu-releases/noble/ubuntu-24.04-live-server-amd64.iso 如果不使用Ubuntu系统&#xff0c;自己可以在下图选择对应版本。安装操作差不多&#xff0c;就命令有差异。 2、Zabbix版本 &am…

AVL树的学习

1.1 AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了…

微前端架构:使用不同框架构建可扩展的大型应用

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在现代前端开发中&#xff0c;随着应用规模的扩大和团队分工的复杂化&#xff0c;传统的单体前端架构逐渐暴露出维护困难、部署周期长、技术栈更新不便等问题。为了应对这些挑战&#xff0c;微前端架构应运而生。这种架构…

每日OJ_牛客_树根(简单模拟)

目录 牛客_树根&#xff08;简单模拟&#xff09; 解析代码 牛客_树根&#xff08;简单模拟&#xff09; 数根__牛客网 解析代码 这个题目很容易理解&#xff0c;对于数字的每一位进行相加直到不大于9为止即可。 接收字符串得到各个数字&#xff0c;并且每位求和&#xff…

使用yolov5实现目标检测简单案例(测试图片)

一、前置 测试这个案例之前需要安装一些前置的东西&#xff0c;如果已经安装的可以忽略&#xff0c;下面我给出我跟着做的一些很好的博客提供大家参考&#xff0c;因为我们主要目的还是实现yolov5的目标检测。 1、安装nvidia显卡驱动 可以参考&#xff1a;【Windows】安装NV…

从ARM的最强超大核处理器来看:Arm Core里都有啥?

目录 L1 instruction memory systemInstruction decode -指令译码Register rename -寄存器重命名Instruction issue - 指令发射Integer execute - 整数执行Vector execute - 向量执行Advanced SIMD and floating-point support - 高级 SIMD 和浮点支持Cryptographic Extension …

在亚马逊云科技上部署开源大模型并利用RAG和LangChain开发生成式AI应用

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上利用Sag…

CMake 的快速应用

一&#xff0c;什么是CMake&#xff1f; 我们在学习了C 和 C后&#xff0c; 知道从c/c代码,变成可执行文件的过程如下&#xff1a; 如果使用的IDE开发&#xff0c;例如vs 2017&#xff0c;QT,等&#xff0c;那么一般IDE会帮你生成可执行文件&#xff0c;开发者一键点击&#…

Wandb使用指南

安装&#xff1a; pip install wandb 登录 wanbd login 在terminal中操作查看你的API key并粘贴回车进行授权&#xff08;https://wandb.ai/authorize&#xff09; 设置离线模式/在线模式 设置为offline会在无网络&#xff08;内网&#xff09;的时候使用&#xff0c;常用于de…

如何运用独特的产业运营体系打造一流的数字媒体产业园

如何运用独特的产业运营体系打造一流的数字媒体产业园 2024-08-15 17:37树莓集团 在数字经济蓬勃发展的今天&#xff0c;数字媒体产业作为其中的重要一环&#xff0c;正展现出巨大的潜力和活力。而如何运用独特的产业运营体系&#xff0c;打造一流的数字媒体产业园&#xff0…

SQLAlchemy 学习笔记

通信类型&#xff1a;AF_INET 协议家族一般是表示TCP通信的SOC_STREAM和UDP通信的SOCK_DGRAM。对于TCP通信&#xff0c;建立socket连接&#xff0c;&#xff1a; s socket.socket(socket.AF_INET, socket.SOCK_STREAM)连接socket&#xff0c; s.connect((host,port))socket通信…