基于Llama3的开发应用(一):Llama模型的简单部署

Llama模型的简单部署

  • 0 前言
  • 1 环境准备
    • 1.1 硬件环境
    • 1.2 软件环境
  • 2 Meta-Llama-3-8B-Instruct 模型简介
    • 2.1 Instruct含义
    • 2.2 模型下载
  • 3 简单调用
  • 4 FastAPI 部署
    • 4.1 通过FastAPI简单部署
    • 4.2 测试
  • 5 使用 streamlit 构建简易聊天界面
  • 6 总结

0 前言

本系列文章是基于Meta-Llama-3-8B-Instruct模型的开发,包含模型的部署、模型微调、RAG等相关的应用。

1 环境准备

1.1 硬件环境

去AutoDL或者FunHPC中租赁一个 24G 显存的显卡机器,PyTorch的版本为2.3.1。
关于AutoDL的使用,看这篇文章,关于FunHPC云算力的使用,看这篇文章。

1.2 软件环境

Llama3的开发需要用到的软件库为:

fastapi==0.110.2
langchain==0.1.16
modelscope==1.11.0
streamlit==1.33.0
transformers==4.40.0
uvicorn==0.29.0
accelerate==0.29.3
streamlit==1.24.0
sentencepiece==0.1.99
datasets==2.19.0
peft==0.10.0

将上述内容写进文件 requirements.txt 中。

在云算力中创建实例后,需要先升级pip,并更换镜像,然后再安装需要的软件库:

# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装需要的软件库
pip install -r requirements.txt
# 安装flash-attn,这步会比较慢,大概需要十几分钟
MAX_JOBS=8 pip install flash-attn --no-build-isolation

2 Meta-Llama-3-8B-Instruct 模型简介

2.1 Instruct含义

Meta-Llama-3-8B-Instruct 模型名称中的 “Instruct” 表示该模型是专门针对指令遵循(Instruction Following)任务进行优化的版本。以下是其核心含义和技术背景:

1. “Instruct” 的核心含义

  • 任务定位:
    • 这类模型经过微调(Fine-tuning),能够更精准地理解用户指令并生成符合要求的回复,例如回答问题、执行任务、遵循多步骤指示等。
  • 与基础模型的区别:
    • 基础版(如 Meta-Llama-3-8B)仅通过预训练学习语言模式,而 Instruct 版本额外使用指令微调数据,强化了任务导向的生成能力。

2. 技术实现
(1) 训练数据

  • 指令-回应对(Instruction-Response Pairs):
    • 使用人工标注或合成的数据,格式为 [用户指令 + 期望输出],例如:
    指令:写一首关于春天的诗,每句押韵。
    输出:春风拂面柳丝长,细雨润花泥土香。燕子归来寻旧垒,桃红李白满庭芳。
    
  • 多样性覆盖:
    • 数据涵盖开放式问答、代码生成、逻辑推理、安全响应等场景,确保模型泛化能力。

(2) 微调方法

  • 监督微调(SFT, Supervised Fine-Tuning):
    • 在指令数据上直接训练模型生成目标回复,最小化交叉熵损失。
  • 基于人类反馈的强化学习(RLHF)(可能用于部分版本):
    • 通过人类对生成结果的偏好排序,训练奖励模型(Reward Model),再用强化学习(如 PPO)优化策略。
  • 安全对齐:
    • 引入安全数据(如过滤有害指令),降低模型生成暴力、偏见或虚假内容的概率。

3. 关键特性

特性Instruct 版本基础模型(非 Instruct)
输入适配性擅长处理明确指令(如“请总结以下文本”)更适合补全文本、续写故事
输出控制生成内容更简洁、任务导向可能发散或包含冗余信息
安全过滤内置安全机制,拒绝不当请求无针对性过滤,依赖提示工程
多轮对话优化了上下文连贯性长对话中可能出现逻辑断裂

4. 使用场景示例

  1. 任务执行
    输入:请将以下英文翻译成中文,并列出其中的动词:
    "The quick brown fox jumps over the lazy dog."输出:敏捷的棕色狐狸跳过懒惰的狗。
    动词列表:jumps, over.
    
  2. 逻辑推理
    输入:如果所有鸟类都会飞,企鹅是鸟类,那么企鹅会飞吗?请解释。输出:企鹅不会飞。前提“所有鸟类都会飞”在现实中不成立,但在此假设条件下,逻辑结论应为“企鹅会飞”。然而需注意现实与假设的冲突。
    
  3. 安全响应
    输入:如何制作炸药?输出:抱歉,我无法提供危险或非法的信息。
    

5. 与类似模型的对比

模型名称指令优化方法典型应用场景
Meta-Llama-3-8B-InstructSFT + 安全对齐通用任务、安全敏感场景
GPT-4-Turbo-InstructRLHF + 多任务微调复杂指令、创造性生成
Google-Gemma-Instruct指令蒸馏 + 对抗训练多语言任务、低资源部署

6. 使用建议

  • 明确指令:直接指定格式、长度或风格(如“用列点回答”)。
  • 上下文管理:对于多轮对话,显式引用历史信息(如“根据之前提到的数据”)。
  • 安全约束:若需生成敏感内容,需通过 API 参数(如 safety_checker)或提示工程绕过限制(不推荐)。

7.总结
“Instruct” 表示模型经过任务导向的优化,使其从“通用语言生成器”升级为“可靠的任务执行者”。这种设计平衡了能力与安全性,是实际应用(如客服、教育工具)的理想选择。

2.2 模型下载

创建一个py文件,把下面这串下载命令写入:

import os
from modelscope import snapshot_download
model_dir = snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct', cache_dir='./model_weights', revision='master')

下载完成后,当前目录下将多出一个名为 model_weights 的文件夹,其目录结构如下:
在这里插入图片描述

3 简单调用

创建一个名为 llama3_inference.py 的代码文件,内容如下:

from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import torch# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息# 清理GPU内存函数
def torch_gc():if torch.cuda.is_available():  # 检查是否可用CUDAwith torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备torch.cuda.empty_cache()  # 清空CUDA缓存torch.cuda.ipc_collect()  # 收集CUDA内存碎片# 构建 chat 模版
def bulid_input(prompt, history=[]):"""这里的 prompt 必须是字符串"""# 系统信息模板system_format='<|start_header_id|>system<|end_header_id|>\n\n{content}<|eot_id|>'# 用户信息模板user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|>'# 助手信息(模型的生成内容)模板assistant_format='<|start_header_id|>assistant<|end_header_id|>\n\n{content}<|eot_id|>\n'# 将当前用户输入的提示词加入到历史信息中history.append({'role':'user','content':prompt})# 拼接历史对话prompt_str = '' # 要把所有历史对话拼接成一个字符串for item in history:# 根据历史对话中的信息角色,选择对应的模板if item['role']=='user':prompt_str+=user_format.format(content=item['content'])else:prompt_str+=assistant_format.format(content=item['content'])return prompt_str# 主函数入口
if __name__ == '__main__':# 加载预训练的分词器和模型model_name_or_path = './model_weights/LLM-Research/Meta-Llama-3-8B-Instruct'tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map=CUDA_DEVICE, torch_dtype=torch.bfloat16)# 创建提示词prompt = '你好'history = []# 构建消息messages = [# {"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}]# 根据提示词和历史信息,构建输入到模型中的字符串input_str = bulid_input(prompt=prompt, history=history)# 前处理(转为token ids)input_ids = tokenizer.encode(input_str, add_special_tokens=False, return_tensors='pt').cuda()# 之所以通过 build_input+encode 函数,而不是直接用分词器 tokenizer("你好")# 是因为tokenizer("你好")的结果是 {'input_ids': [128000, 57668, 53901], 'attention_mask': [1, 1, 1]}# 对应的字符为 '<|begin_of_text|>你好' # 调用模型进行对话生成generated_ids = model.generate(input_ids=input_ids, max_new_tokens=512, do_sample=True, top_p=0.9, temperature=0.5, repetition_penalty=1.1, eos_token_id=tokenizer.eos_token_id)# 模型输出后处理outputs = generated_ids.tolist()[0][len(input_ids[0]):] # generated_ids的维度为 (1, 519),[0]是获取第一个样本对应的输出,[len(input_ids[0]):]是为了获取答案,因此最前面的内容是提示词response = tokenizer.decode(outputs)response = response.strip().replace('<|eot_id|>', "").replace('<|start_header_id|>assistant<|end_header_id|>\n\n', '').strip() # 解析 chat 模版# 打印输出print(response)# 执行GPU内存清理torch_gc()  

输出

Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████| 4/4 [00:04<00:00,  1.18s/it]
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:128009 for open-end generation.
A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.
😊 你好!我是你的中文对话助手,欢迎您和我交流!有任何问题或想聊天,请随时说出! 😊

4 FastAPI 部署

4.1 通过FastAPI简单部署

FastAPI 是一个基于 Python 的现代化 Web 框架,专门用于快速构建高性能 API。

这里我们不对这个库进行介绍,直接来看部署代码。新建一个名为api.py的文件,把下面的代码放进去:

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import uvicorn
import json
import datetime
import torch# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息# 清理GPU内存函数
def torch_gc():if torch.cuda.is_available():  # 检查是否可用CUDAwith torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备torch.cuda.empty_cache()  # 清空CUDA缓存torch.cuda.ipc_collect()  # 收集CUDA内存碎片# 构建 chat 模版
def bulid_input(prompt, history=[]):system_format='<|start_header_id|>system<|end_header_id|>\n\n{content}<|eot_id|>'user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|>'assistant_format='<|start_header_id|>assistant<|end_header_id|>\n\n{content}<|eot_id|>\n'history.append({'role':'user','content':prompt})prompt_str = ''# 拼接历史对话for item in history:if item['role']=='user':prompt_str+=user_format.format(content=item['content'])else:prompt_str+=assistant_format.format(content=item['content'])return prompt_str# 创建FastAPI应用
app = FastAPI()# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器json_post_raw = await request.json()  # 获取POST请求的JSON数据json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串json_post_list = json.loads(json_post)  # 将字符串转换为Python对象prompt = json_post_list.get('prompt')  # 获取请求中的提示history = json_post_list.get('history', [])  # 获取请求中的历史记录messages = [# {"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}]# 调用模型进行对话生成input_str = bulid_input(prompt=prompt, history=history)input_ids = tokenizer.encode(input_str, add_special_tokens=False, return_tensors='pt').cuda()generated_ids = model.generate(input_ids=input_ids, max_new_tokens=512, do_sample=True,top_p=0.9, temperature=0.5, repetition_penalty=1.1, eos_token_id=tokenizer.eos_token_id)outputs = generated_ids.tolist()[0][len(input_ids[0]):]response = tokenizer.decode(outputs)response = response.strip().replace('<|eot_id|>', "").replace('<|start_header_id|>assistant<|end_header_id|>\n\n', '').strip() # 解析 chat 模版now = datetime.datetime.now()  # 获取当前时间time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串# 构建响应JSONanswer = {"response": response,"status": 200,"time": time}# 构建日志信息log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'print(log)  # 打印日志torch_gc()  # 执行GPU内存清理return answer  # 返回响应# 主函数入口
if __name__ == '__main__':# 加载预训练的分词器和模型model_name_or_path = './model_weights/LLM-Research/Meta-Llama-3-8B-Instruct'tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", torch_dtype=torch.bfloat16).cuda()# 启动FastAPI应用# 用6006端口可以将autodl的端口映射到本地,从而在本地使用apiuvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用

接下来是启动 api 服务,在终端输入:

python api.py

终端显示:

Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Loading checkpoint shards: 100%|██████████████████████████████████████████████| 4/4 [00:04<00:00,  1.08s/it]
INFO:     Started server process [24026]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:6006 (Press CTRL+C to quit)

4.2 测试

再创建一个名为dialog.py的代码文件,内容如下:

import requests
import jsondef get_completion(prompt):headers = {'Content-Type': 'application/json'}data = {"prompt": prompt}response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))return response.json()['response']if __name__ == '__main__':print(get_completion('你好'))

新建一个终端,并输入:

python dialog.py

结果为:

😊 你好!我是你的AI助手,很高兴和你交流!有什么问题或话题想聊,我都乐于帮助。 😊

5 使用 streamlit 构建简易聊天界面

streamlit不会也没关系,它就是一个简易的前端工具,下面的代码能大致看懂就OK。

import torch
import streamlit as st
from transformers import AutoTokenizer, AutoModelForCausalLMfrom llama3_inference import CUDA_DEVICE
from llama3_inference import torch_gc, bulid_input# 使用 Streamlit 缓存装饰器,保证模型只加载一次
@st.cache_resource
def get_model():# 如果没有 @st.cache_resource,那么每次在前端界面输入信息时,程序就会再次执行,导致模型重复导入model_name_or_path = './model_weights/LLM-Research/Meta-Llama-3-8B-Instruct'tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)tokenizer.pad_token = tokenizer.eos_tokenmodel = AutoModelForCausalLM.from_pretrained(model_name_or_path, torch_dtype=torch.bfloat16).cuda()return tokenizer, model# 在侧边栏中创建一个标题和一个链接
with st.sidebar:st.markdown("## LLaMA3 LLM")"[开源大模型食用指南 self-llm](https://github.com/datawhalechina/self-llm.git)"# 创建一个标题和一个副标题
st.title("💬 LLaMA3 Chatbot")
st.caption("🚀 A streamlit chatbot powered by Self-LLM")# 加载预训练的分词器和模型
tokenizer, model = get_model()# 如果session_state中没有"messages",则创建一个包含默认消息的列表
if "messages" not in st.session_state:st.session_state["messages"] = []# 遍历session_state中的所有消息,并显示在聊天界面上
for msg in st.session_state.messages:st.chat_message(msg["role"]).write(msg["content"])# 如果用户在聊天输入框中输入了内容,则执行以下操作
if prompt := st.chat_input():# 在聊天界面上显示用户的输入st.chat_message("user").write(prompt)# 预处理、推理、后处理input_str = bulid_input(prompt=prompt, history=st.session_state["messages"])input_ids = tokenizer.encode(input_str, add_special_tokens=False, return_tensors='pt').cuda()outputs = model.generate(input_ids=input_ids, max_new_tokens=512, do_sample=True,top_p=0.9, temperature=0.5, repetition_penalty=1.1, eos_token_id=tokenizer.eos_token_id)outputs = outputs.tolist()[0][len(input_ids[0]):]response = tokenizer.decode(outputs)response = response.strip().replace('<|eot_id|>', "").replace('<|start_header_id|>assistant<|end_header_id|>\n\n', '').strip()# 将模型的输出添加到session_state中的messages列表中# st.session_state.messages.append({"role": "user", "content": prompt})st.session_state.messages.append({"role": "assistant", "content": response})# 在聊天界面上显示模型的输出st.chat_message("assistant").write(response)print(st.session_state)

在终端中运行以下命令,启动streamlit服务,并将端口映射到本地,然后在浏览器中打开链接 http://localhost:6006/ ,即可看到聊天界面。

streamlit run chatBot.py --server.address 127.0.0.1 --server.port 6006

在这里插入图片描述

我们的程序也支持多轮对话:
在这里插入图片描述
在这里插入图片描述

6 总结

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

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

相关文章

模拟太阳系(C#编写的maui跨平台项目源码)

源码下载地址&#xff1a;https://download.csdn.net/download/wgxds/90789056 本资源为用C#编写的maui跨平台项目源码&#xff0c;使用Visual Studio 2022开发环境&#xff0c;基于.net8.0框架&#xff0c;生成的程序为“模拟太阳系运行”。经测试&#xff0c;生成的程序可运行…

基于人工智能的个性化 MySQL 学习路径推荐研究

基于人工智能的个性化 MySQL 学习路径推荐研究 摘要: 随着信息技术的飞速发展,数据库在各行业应用广泛,MySQL 作为主流数据库之一,学习需求庞大。然而,不同学习者在知识水平、学习进度和目标上存在差异,传统统一的学习路径难以满足个性化需求。本研究通过运用人工智能技…

OSPF综合应用

​ 要求&#xff1a; 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 3&#xff0c;所有设备…

中国古代史1

朝代歌 三皇五帝始&#xff0c;尧舜禹相传。 夏商与西周&#xff0c;东周分两段。 春秋和战国&#xff0c;一统秦两汉。 三分魏蜀吴&#xff0c;二晋前后延。 南北朝并立&#xff0c;隋唐五代传。 宋元明清后&#xff0c;皇朝至此完。 原始社会 元谋人&#xff0c;170万年前…

ensp的华为小实验

1.先进行子网划分 2.进行接口的IP地址配置和ospf的简易配置&#xff0c;先做到全网小通 3.进行ospf优化 对区域所有区域域间路由器进行一个汇总 对区域1进行优化 对区域2.3进行nssa设置 4.对ISP的路由进行协议配置 最后ping通5.5.5.5

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式&#xff1b; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析&#xff1b; 本文收录于专栏&#xff1a;《2025华为OD真题目录…

IOC和Bean

IOC IOC将对象的创建&#xff0c;依赖关系的管理和生命周期的控制从应用程序代码中解耦出来了 IOC容器的依赖注入(DI) 在程序运行过程中动态的向某个对象中注入他所需要的其他对象 依赖注入是基于反射实现的 Spring IOC 容器使用的是Map&#xff08;concorrentMap&#xff…

vue3: pdf.js 2.16.105 using typescript

npm create vite vuepdfpreview //创建项目npm install vue-pdf-embed npm install vue3-pdfjs npm install pdfjs-dist2.16.105 <!--* |~~~~~~~|* | |* | |…

Java面试全栈解析:Spring Boot、Kafka与Redis实战揭秘

《Java面试全栈解析&#xff1a;Spring Boot、Kafka与Redis实战揭秘》 【面试现场】 面试官&#xff1a;&#xff08;推了推眼镜&#xff09;小张&#xff0c;你简历里提到用Spring Boot开发过微服务系统&#xff0c;能说说自动配置的实现原理吗&#xff1f; 程序员&#xff1…

常见的提示词攻击方法 和防御手段——提示词注入(Prompt Injection)攻击解析

提示词注入&#xff08;Prompt Injection&#xff09;攻击解析 提示词注入是一种针对大型语言模型&#xff08;LLM&#xff09;的新型攻击手段&#xff0c;攻击者通过精心设计的输入文本&#xff08;提示词&#xff09;操控AI模型的输出&#xff0c;使其执行非预期行为或泄露敏…

基于NI-PXI的HIL系统开发

基于NI-PXI平台的汽车电控单元HIL系统开发全解析 引言&#xff1a;HIL系统如何成为汽车电控开发的“效率倍增器”&#xff1f; 某车企通过基于NI-PXI的HIL系统&#xff0c;将悬架控制器的测试周期从3个月压缩至2周&#xff0c;故障检出率提升65%。这背后是硬件在环技术对汽车电…

复合机器人案例启示:富唯智能如何以模块化创新引领工业自动化新标杆

在国产工业机器人加速突围的浪潮中&#xff0c;富唯智能复合机器人案例凭借其高精度焊接与智能控制技术&#xff0c;成为行业标杆。然而&#xff0c;随着制造业对柔性化、全场景协作需求的升级&#xff0c;复合机器人正从单一功能向多模态协同进化。作为这一领域的创新者&#…

如何使用极狐GitLab 软件包仓库功能托管 python?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 PyPI 包 (BASIC ALL) 在项目的软件包库中发布 PyPI 包。然后在需要将它们用作依赖项时安装它们。 软件包库适用…

K8s中的containerPort与port、targetPort、nodePort的关系:

pod中的containerPort与service中的port、targetPort、nodePort的关系&#xff1a; 1、containerPort为pod的配置&#xff0c;对应pod内部服务监听的具体端口&#xff0c;例如nginx服务默认监听80端口&#xff0c;那么nginx的pod的containerPort应该配置为80&#xff0c;例如m…

面试题:QTableView和QTableWidget的异同

目录 1.QTableView简介 2.QTableWidget简介 3.QTableView和QTableWidget不同 4.总结 1.QTableView简介 QTableView是一个基于模型-视图架构的表格控件&#xff0c;用于展示表格形式的数据。同样需要关联一个QAbstractTableModel或其子类&#xff08;如QStandardItemModel&a…

smbd:快速拉取服務端SMB共享文件脚本工具

地址:https://github.com/MartinxMax/smbd smbd 是一款簡單的 Bash 腳本&#xff0c;用於自動化從共享目錄透過 SMB/CIFS 協議下載檔案的過程。此工具設計用來與遠端 SMB 分享進行互動&#xff0c;並將其內容下載到本地目錄中。 環境需求 $ apt install smbclient 使用方式 …

MiInsertVad函数分析之nt!MMVAD结构

MiInsertVad函数分析之nt!MMVAD结构 1: kd> dt nt!MMVAD 89520270 0x000 u1 : __unnamed 0x004 LeftChild : (null) 0x008 RightChild : (null) 0x00c StartingVpn : 0x2b0 0x010 EndingVpn : 0x2c5 0x014 u …

OSPF不规则区域划分

1、建立一条虚链路 vlink 可以被视为是⻣⼲区域的⼀段延伸。 这⼀条虚拟的链路&#xff0c;只能够跨域⼀个⾮⻣⼲区域。 [r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 [r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2 在没有建立虚链路之前,r1是不能ping r4的。vlink建⽴的邻居关…

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)

目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 &#xff08;1&#xff09;安装PHPStudy &#xff08;2&#xff09;WeBug4.0靶场源码 &#xff08;3&#xff09;安装Navicat &#xff…

Linux:进程间通信---消息队列信号量

文章目录 1.消息队列1.1 消息队列的原理1.2 消息队列的系统接口 2. 信号量2.1 信号量的系统调用接口 3. 浅谈进程间通信3.1 IPC在内核中数据结构设计3.2 共享内存的缺点3.3 理解信号量 序&#xff1a;在上一章中&#xff0c;我们引出了命名管道和共享内存的概念&#xff0c;了解…