利用Lora调整和部署 LLM

使用 NVIDIA TensorRT-LLM 调整和部署 LoRA LLM

大型语言模型 (LLM) 能够从大量文本中学习并为各种任务和领域生成流畅且连贯的文本,从而彻底改变了自然语言处理 (NLP)。 然而,定制LLM是一项具有挑战性的任务,通常需要完整的培训过程,该过程非常耗时且计算成本高昂。 此外,训练LLM需要多样化且具有代表性的数据集,而这些数据集可能很难获取和管理。

企业如何在不支付全面培训费用的情况下利用LLM的力量? 一个有前途的解决方案是低秩适应(LoRA),这是一种微调方法,可以显着减少可训练参数的数量、内存需求和训练时间,同时实现与各种 NLP 微调相当甚至更好的性能 任务和领域。

这篇文章解释了 LoRA 的直觉和实现,并展示了它的一些应用和优点。 它还将 LoRA 与监督微调和即时工程进行了比较,并讨论了它们的优点和局限性。 它概述了 LoRA 调整模型的训练和推理的实用指南。 最后,它演示了如何使用 NVIDIA TensorRT-LLM 优化 LoRA 模型在 NVIDIA GPU 上的部署。

教程先决条件

为了充分利用本教程,您将需要 LLM 训练和推理流程的基本知识,以及:

  • 线性代数基础知识
  • Hugging Face 注册用户访问权限以及对 Transformers 库的总体熟悉程度
  • NVIDIA/TensorRT-LLM优化库
  • 具有 TensorRT-LLM 后端的 NVIDIA Triton 推理服务器

什么是LoRA?

LoRA是一种微调方法,它将低秩矩阵引入到LLM架构的每一层中,并且仅训练这些矩阵,同时保持原始LLM权重冻结。 它是 NVIDIA NeMo 支持的 LLM 定制工具之一。

LLM 功能强大,但通常需要定制,尤其是在用于企业或特定领域的用例时。 有许多调整选项,从简单的提示工程到监督微调 (SFT)。 调整选项的选择通常基于所需数据集的大小(即时工程的最小值,SFT 的最大值)和计算可用性。

LoRA 调优是一种称为参数高效微调 (PEFT) 的调优系列。 这些技术是一种中间方法。 与即时工程相比,它们需要更多的训练数据和计算,但也能产生更高的准确性。 共同的主题是他们引入少量参数或层,同时保持原始 LLM 不变。

PEFT 已被证明可以在使用更少的数据和计算资源的情况下实现与 SFT 相当的精度。 与其他调优技术相比,LoRA 有几个优点。 它减少了计算和内存成本,因为它只添加了一些新参数,但不添加任何层。 它支持多任务学习,通过按需部署相关的微调 LoRA 变体,允许将单基 LLM 用于不同的任务,仅在需要时加载其低秩矩阵。

最后,它避免了灾难性遗忘,即LLM在学习新数据时突然忘记以前学到的信息的自然倾向。 从数量上讲,LoRA 的性能优于使用其他调优技术(例如提示调优和适配器)的模型,如《LoRA:大型语言模型的低阶适应》中所示。

LoRA 背后的数学原理

LoRA 背后的数学基于低秩分解的思想,这是一种通过两个较低秩的较小矩阵的乘积来近似矩阵的方法。 矩阵的秩是矩阵中线性独立的行或列的数量。 低秩矩阵具有较少的自由度,并且可以比满秩矩阵更紧凑地表示。

LoRA 对 LLM 的权重矩阵应用低秩分解,这些矩阵通常非常大且密集。 例如,如果 LLM 的隐藏大小为 1,024,词汇大小为 50,000,则输出权重矩阵 W 将具有 1024 x 50,000 = 51,200,000 个参数。

LoRA 将此矩阵 W 分解为两个较小的矩阵,即形状为 1024 x r 的矩阵 A 和形状为 r x 50,000 的矩阵 B,其中 r 是控制分解秩的超参数。 这两个矩阵的乘积将具有与原始矩阵相同的形状,但只有 1024 x r + r x 50,000 = 51,200,000 – 50,000 x (1024 – r) 参数。

超参数 r 对于正确设置至关重要。 选择较小的r可以节省大量参数和内存,实现更快的训练。 然而,较小的 r 可能会减少低秩矩阵中捕获的特定于任务的信息。 较大的 r 可能会导致过度拟合。 因此,为了实现特定任务和数据的理想精度与性能权衡,进行实验非常重要。

LoRA将这些低秩矩阵插入到LLM的每一层中,并将它们添加到原始权重矩阵中。 原始权重矩阵使用预训练的 LLM 权重进行初始化,并且在训练期间不会更新。 低秩矩阵是随机初始化的,并且是训练期间唯一更新的参数。 LoRA 还将层归一化应用于原始矩阵和低秩矩阵的总和以稳定训练。

多LoRA部署

部署LLM的一大挑战是如何有效地服务数百或数千个调优模型。 例如,单一基础 LLM(例如 Llama 2)可能针对每种语言或区域设置有许多经过 LoRA 调整的变体。 标准系统需要独立加载所有模型,占用大量内存容量。 利用 LoRA 的设计,通过加载单个基本模型以及每个相应 LoRA 调整变体的低秩矩阵 A 和 B,捕获每个模型较小的低秩矩阵中的所有信息。 通过这种方式,可以存储数千个 LLM 并在最小的 GPU 内存占用范围内动态、高效地运行它们。

LoRA调优

LoRA 调优需要准备特定格式的训练数据集,通常使用提示模板。 在形成提示时,您应该确定并遵循一种模式,该模式自然会因不同的用例而异。 下面显示了问题和答案的示例。

{
        "taskname": "squad",
        "prompt_template": "<|VIRTUAL_PROMPT_0|> Context: {context}\n\nQuestion: {question}\n\nAnswer:{answer}",
        "total_virtual_tokens": 10,
        "virtual_token_splits": [10],
        "truncate_field": "context",
        "answer_only_loss": True,
        "answer_field": "answer",
}

提示包含开头的所有 10 个虚拟标记,然后是上下文、问题,最后是答案。 训练数据JSON对象中的相应字段将映射到该提示模板,形成完整的训练示例。

有几个可用的平台可用于定制LLM。 您可以使用 NVIDIA NeMo 或 Hugging Face PEFT 等工具。 有关如何使用 NeMo 在 PubMed 数据集上调整 LoRA 的示例,请参阅 NeMo Framework PEFT with Llama 2。

请注意,这篇文章使用来自 Hugging Face 的已调优的 LLM,因此无需进行调优。

LoRA推理

要使用 TensorRT-LLM 优化 LoRA 调整的 LLM,您必须了解其架构并确定它最接近的通用基础架构。 本教程使用 Llama 2 13B 和 Llama 2 7B 作为基本模型,以及 Hugging Face 上提供的几个经过 LoRA 调整的变体。

第一步是使用该目录中的转换器和构建脚本来编译所有模型并为硬件加速做好准备。 然后,我将展示使用命令行和 Triton 推理服务器进行部署的示例。

请注意,分词器不是由 TensorRT-LLM 直接处理的。 但有必要能够将其分类到定义的分词器系列中,以供运行时以及在 Triton 中设置预处理和后处理步骤。

设置和构建 TensorRT-LLM

首先克隆并构建 NVIDIA/TensorRT-LLM 库。 构建 TensorRT-LLM 并检索其所有依赖项的最简单方法是使用附带的 Dockerfile。 这些命令拉取基础容器并在容器内安装 TensorRT-LLM 所需的所有依赖项。 然后它会在容器中构建并安装 TensorRT-LLM 本身。

git lfs install
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
git submodule update --init --recursive
make -C docker release_build

检索模型权重

从 Hugging Face 下载基础模型和 LoRA 模型:

git-lfs clone https://huggingface.co/meta-llama/Llama-2-13b-hf
git-lfs clone https://huggingface.co/hfl/chinese-llama-2-lora-13b

编译模型

构建引擎,设置 --use_lora_plugin--hf_lora_dir。 如果 LoRA 有单独的 lm_head 和嵌入,它们将替换基础模型的 lm_head 和嵌入。

python convert_checkpoint.py --model_dir /tmp/llama-v2-13b-hf \
                         --output_dir ./tllm_checkpoint_2gpu_lora \
                         --dtype float16 \
                         --tp_size 2 \
                         --hf_lora_dir /tmp/chinese-llama-2-lora-13b
                          
trtllm-build --checkpoint_dir ./tllm_checkpoint_2gpu_lora \
            --output_dir /tmp/new_lora_13b/trt_engines/fp16/2-gpu/ \
            --gpt_attention_plugin float16 \
            --gemm_plugin float16 \
            --lora_plugin float16 \
            --max_batch_size 1 \
            --max_input_len 512 \
            --max_output_len 50 \
            --use_fused_mlp

运行模型

要在推理期间运行模型,请设置 lora_dir 命令行参数。 请记住使用 LoRA 分词器,因为经过 LoRA 调整的模型具有更大的词汇量。

mpirun -n 2 python ../run.py --engine_dir "/tmp/new_lora_13b/trt_engines/fp16/2-gpu/" \
              --max_output_len 50 \
              --tokenizer_dir "chinese-llama-2-lora-13b/" \
              --input_text "今天天气很好,我到公园的时后," \
              --lora_dir "chinese-llama-2-lora-13b/" \
              --lora_task_uids 0 \
              --no_add_special_tokens \
              --use_py_session
 
 Input: "今天天气很好,我到公园的时后,"
Output: "发现公园里人很多,有的在打羽毛球,有的在打乒乓球,有的在跳绳,还有的在跑步。我和妈妈来到一个空地上,我和妈妈一起跳绳,我跳了1"

您可以运行消融测试来直接查看 LoRA 调整模型的贡献。 要轻松比较使用和不使用 LoRa 的结果,只需使用 --lora_task_uids -1 将 UID 设置为 -1。 在这种情况下,模型将忽略 LoRA 模块,结果将仅基于基本模型。

mpirun -n 2 python ../run.py --engine_dir "/tmp/new_lora_13b/trt_engines/fp16/2-gpu/" \
              --max_output_len 50 \
              --tokenizer_dir "chinese-llama-2-lora-13b/" \
              --input_text "今天天气很好,我到公园的时后," \
              --lora_dir "chinese-llama-2-lora-13b/" \
              --lora_task_uids -1 \
              --no_add_special_tokens \
              --use_py_session
 
 Input: "今天天气很好,我到公园的时后,"
Output: "我看见一个人坐在那边边看书书,我看起来还挺像你,可是我走过过去问了一下他说你是你吗,他说没有,然后我就说你看我看看你像你,他说说你看我像你,我说你是你,他说你是你,"

使用多个 LoRA 调整模型运行基本模型

TensorRT-LLM 还支持同时运行具有多个 LoRA 调整模块的单个基本模型。 这里,我们以两个 LoRA 检查点为例。 由于两个检查点的LoRA模块的rank r都是8,因此您可以将–max_lora_rank设置为8,以减少LoRA插件的内存需求。

此示例使用在中国数据集 luotuo-lora-7b-0.1 上微调的 LoRA 检查点和在日本数据集 Japanese-Alpaca-LoRA-7b-v0 上微调的 LoRA 检查点。 为了让 TensorRT-LLM 加载多个检查点,请通过 --lora_dir “luotuo-lora-7b-0.1/” " Japanese-Alpaca-LoRA-7b-v0/" 传入所有 LoRA 检查点的目录。 TensorRT-LLM 会将 lora_task_uids 分配给这些检查点。 lora_task_uids -1 是预定义值,对应于基础模型。 例如,传递 lora_task_uids 0 1 将在第一个句子上使用第一个 LoRA 检查点,在第二个句子上使用第二个 LoRA 检查点。

为了验证正确性,通过同样的中文输入 美国的首都在哪里? \n答案: 三次,还有同样的日文输入メリカ合众国の首都はどこですか? \n答え:三遍。 (在英语中,两个输入的意思是“美国的首都在哪里?\n答案”)。 然后分别在基础模型 luotuo-lora-7b-0.1 和 Japanese-Alpaca-LoRA-7b-v0 上运行:

git-lfs clone https://huggingface.co/qychen/luotuo-lora-7b-0.1
git-lfs clone https://huggingface.co/kunishou/Japanese-Alpaca-LoRA-7b-v0
BASE_LLAMA_MODEL=llama-7b-hf/
 
python convert_checkpoint.py --model_dir ${BASE_LLAMA_MODEL} \
                            --output_dir ./tllm_checkpoint_1gpu_lora_rank \
                            --dtype float16 \
                            --hf_lora_dir /tmp/Japanese-Alpaca-LoRA-7b-v0 \
                            --max_lora_rank 8 \
                            --lora_target_modules "attn_q" "attn_k" "attn_v"
 
trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu_lora_rank \
            --output_dir /tmp/llama_7b_with_lora_qkv/trt_engines/fp16/1-gpu/ \
            --gpt_attention_plugin float16 \
            --gemm_plugin float16 \
            --lora_plugin float16 \
            --max_batch_size 1 \
            --max_input_len 512 \
            --max_output_len 50
 
python ../run.py --engine_dir "/tmp/llama_7b_with_lora_qkv/trt_engines/fp16/1-gpu/" \
              --max_output_len 10 \
              --tokenizer_dir ${BASE_LLAMA_MODEL} \
              --input_text "美国的首都在哪里? \n答案:" "美国的首都在哪里? \n答案:" "美国的首都在哪里? \n答案:" "アメリカ合衆国の首都はどこですか? \n答え:" "アメリカ合衆国の首都はどこですか? \n答え:" "アメリカ合衆国の首都はどこですか? \n答え:" \
              --lora_dir  "luotuo-lora-7b-0.1/" "Japanese-Alpaca-LoRA-7b-v0/" \
              --lora_task_uids -1 0 1 -1 0 1 \
              --use_py_session --top_p 0.5 --top_k 0

结果如下所示:

Input [Text 0]: "<s> 美国的首都在哪里? \n答案:"
Output [Text 0 Beam 0]: "Washington, D.C.
What is the"
 
Input [Text 1]: "<s> 美国的首都在哪里? \n答案:"
Output [Text 1 Beam 0]: "华盛顿。
"
 
Input [Text 2]: "<s> 美国的首都在哪里? \n答案:"
Output [Text 2 Beam 0]: "Washington D.C.'''''"
 
Input [Text 3]: "<s> アメリカ合衆国の首都はどこですか? \n答え:"
Output [Text 3 Beam 0]: "Washington, D.C.
Which of"
 
Input [Text 4]: "<s> アメリカ合衆国の首都はどこですか? \n答え:"
Output [Text 4 Beam 0]: "华盛顿。
"
 
Input [Text 5]: "<s> アメリカ合衆国の首都はどこですか? \n答え:"
Output [Text 5 Beam 0]: "ワシントン D.C."

请注意,luotuo-lora-7b-0.1 对第一句和第五句(中文)产生了正确答案。 Japanese-Alpaca-LoRA-7b-v0 给出第六句的正确答案(日语)。

重要提示:如果其中一个 LoRA 模块包含微调嵌入表或 logit GEMM,则用户必须保证模型的所有实例都可以使用相同的微调嵌入表或 logit GEMM。

使用 Triton 和飞行批处理部署 LoRA 调整模型

本节介绍如何使用 Triton Inference 服务器进行动态批处理来部署经过 LoRA 调整的模型。 有关设置和启动 Triton 推理服务器的具体说明,请参阅使用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 部署 AI 编码助手。

和以前一样,首先编译启用 LoRA 的模型,这次使用基本模型 Llama 2 7B。

BASE_MODEL=llama-7b-hf
 
python3 tensorrt_llm/examples/llama/build.py --model_dir ${BASE_MODEL} \
                --dtype float16 \
                --remove_input_padding \
                --use_gpt_attention_plugin float16 \
                --enable_context_fmha \
                --use_gemm_plugin float16 \
                --output_dir "/tmp/llama_7b_with_lora_qkv/trt_engines/fp16/1-gpu/" \
                --max_batch_size 128 \
                --max_input_len 512 \
                --max_output_len 50 \
                --use_lora_plugin float16 \
                --lora_target_modules "attn_q" "attn_k" "attn_v" \
                --use_inflight_batching \
                --paged_kv_cache \
                --max_lora_rank 8 \
                --world_size 1 --tp_size 1

接下来,生成将随每个请求传递给 Triton 的 LoRA 张量。

git-lfs clone https://huggingface.co/qychen/luotuo-lora-7b-0.1
git-lfs clone https://huggingface.co/kunishou/Japanese-Alpaca-LoRA-7b-v0
 
python3 tensorrt_llm/examples/hf_lora_convert.py -i Japanese-Alpaca-LoRA-7b-v0 -o Japanese-Alpaca-LoRA-7b-v0-weights --storage-type float16
python3 tensorrt_llm/examples/hf_lora_convert.py -i luotuo-lora-7b-0.1 -o luotuo-lora-7b-0.1-weights --storage-type float16

然后创建一个 Triton 模型存储库并启动 Triton 服务器,如前所述。

最后,通过从客户端发出多个并发请求来运行多 LoRA 示例。 inflight batcher程序将在同一批处理中执行多个 LoRA 的混合批处理。

INPUT_TEXT=("美国的首都在哪里? \n答案:" "美国的首都在哪里? \n答案:" "美国的首都在哪里? \n答案:" "アメリカ合衆国の首都はどこですか? \n答え:" "アメリカ合衆国の首都はどこですか? \n答え:" "アメリカ合衆国の首都はどこですか? \n答え:")
LORA_PATHS=("" "luotuo-lora-7b-0.1-weights" "Japanese-Alpaca-LoRA-7b-v0-weights" "" "luotuo-lora-7b-0.1-weights" "Japanese-Alpaca-LoRA-7b-v0-weights")
 
for index in ${!INPUT_TEXT[@]}; do
    text=${INPUT_TEXT[$index]}
    lora_path=${LORA_PATHS[$index]}
    lora_arg=""
    if [ "${lora_path}" != "" ]; then
        lora_arg="--lora-path ${lora_path}"
    fi
 
    python3 inflight_batcher_llm/client/inflight_batcher_llm_client.py \
        --top-k 0 \
        --top-p 0.5 \
        --request-output-len 10 \
        --text "${text}" \
        --tokenizer-dir /home/scratch.trt_llm_data/llm-models/llama-models/llama-7b-hf \
        ${lora_arg} &
done
 
wait

示例输出如下所示:

Input sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901]
Input sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 139, 29901]
Input sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 139, 29901]
Input sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901]
Input sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901]
Input sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 139, 29901]
Got completed request
Input: アメリカ合衆国の首都はどこですか? \n答え:
Output beam 0: ワシントン D.C.
Output sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901, 29871, 31028, 30373, 30203, 30279, 30203, 360, 29889, 29907, 29889]
Got completed request
Input: 美国的首都在哪里? \n答案:
Output beam 0: Washington, D.C.
What is the
Output sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 139, 29901, 7660, 29892, 360, 29889, 29907, 29889, 13, 5618, 338, 278]
Got completed request
Input: 美国的首都在哪里? \n答案:
Output beam 0: Washington D.C.
Washington D.
Output sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 139, 29901, 7660, 360, 29889, 29907, 29889, 13, 29956, 7321, 360, 29889]
Got completed request
Input: アメリカ合衆国の首都はどこですか? \n答え:
Output beam 0: Washington, D.C.
Which of
Output sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901, 7660, 29892, 360, 29889, 29907, 29889, 13, 8809, 436, 310]
Got completed request
Input: アメリカ合衆国の首都はどこですか? \n答え:
Output beam 0: Washington D.C.
1. ア
Output sequence:  [1, 29871, 30310, 30604, 30303, 30439, 30733, 235, 164, 137, 30356, 30199, 31688, 30769, 30449, 31250, 30589, 30499, 30427, 30412, 29973, 320, 29876, 234, 176, 151, 30914, 29901, 7660, 360, 29889, 29907, 29889, 13, 29896, 29889, 29871, 30310]
Got completed request
Input: 美国的首都在哪里? \n答案:
Output beam 0: 华盛顿
W
Output sequence:  [1, 29871, 30630, 30356, 30210, 31688, 30769, 30505, 232, 150, 173, 30755, 29973, 320, 29876, 234, 176, 151, 233, 164, 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:Walk These Ways: 通过行为多样性调整机器人控制以实现泛化

Walk These Ways: 通过行为多样性调整机器人控制以实现泛化 摘要&#xff1a; 通过学习得到的运动策略可以迅速适应与训练期间经历的类似环境&#xff0c;但在面对分布外测试环境失败时缺乏快速调整的机制。这就需要一个缓慢且迭代的奖励和环境重新设计周期来在新任务上达成良…

企业家见识、智慧与胸怀:超越知识、聪明与财富的核心价值​

一、引言 在商界的风云变幻中&#xff0c;企业家们不仅需要拥有丰富的知识和聪明才智&#xff0c;更需要具备远见卓识、深刻智慧和博大胸怀。正如某知名企业家所言&#xff1a;“企业家见识比知识重要&#xff0c;智慧比聪明重要&#xff0c;胸怀比财富重要。”&#xff0c;这…

OSCP靶场--Snookums

OSCP靶场–Snookums 考点(RFI信息收集数据库发现凭据bas64解码su切换用户/etc/passwd覆盖提权) 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.58 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-30 03:39 E…

误删C盘文件导致wps不可用如何解决(window 11)

一开始是为了清理C盘&#xff0c;然后第二天就发现wps不能用了&#xff0c;刚开始的时候Word&#xff0c;Excel&#xff0c;PowerPoint&#xff0c;OneNote都是空白的&#xff0c;连图标都没有了。 点击电脑固定栏左下角的开始 点击设置 点击安装的应用 找到你下载的后点击修改…

连入门都不算的Kylin相关概念畅谈!

本文图片来自于尚硅谷。 即席查询&#xff1f;即时查询&#xff1f; 作者学习过程中已经连续看到过两次即席查询了&#xff0c;不禁冒出个想法&#xff1a;是不是真的有“即席查询”的概念&#xff1f;我还以为是即时查询&#xff0c;打错了呢…… 即席查询概念 确实存在“即…

基于java的电影院售票网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

基于springboot的粮仓管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

《C++程序设计》阅读笔记【2-程序结构】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 程序结构1.1 外部存储类型1.2 静态存储类型1.2.1 静态全局变量1.2.…

设计模式之外观(门面)模式

概念&#xff1a;要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口&#xff0c;使得子系统更易使用。 外观模式注重“统一的对象”&#xff0c;即提供一个访问子系统的接口&#xff0c;只有通过该接口&#xff08;Facade&#xf…

TCP的十个重要的机制

注&#xff1a;TCP不是只有十个机制 TCP 可靠传输是tcp最为重要的核心&#xff08;初心&#xff09; 可靠传输&#xff0c;并不是发送方把数据能够100%的传输给接收方 而是退而求其次 让发送方发送出去数据之后&#xff0c;能够知道接收方是否收到数据。 一但发现对方没有…

IPSec VPN 高级应用

IPSec的隧道嵌套 公网上架设多层隧道&#xff0c;整合不同隧道的优点&#xff0c;弥补缺点 1、GRE over IPSec VPN 1&#xff09;特点 通过GRE隧道运行的路由协议、组播等功能 通过IPSec提供数据的机密性、完整性检查、源认证 IPSec是保护GRE上面的所有流量&#xff08;动…

MIT6.828实验windows10下环境配置

根据6.1810提供的方法安装环境 实验地址 微软文档 一、安装 Windows Terminal https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701 二、安装WSL2 参考源&#xff1a;tommickey的博客园 启动Windows 子系统 1、 手动开启 打开「控制面板」&#xff…

可以写网易云的了!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中…

2024-HW --->SSRF

这不是马上准备就要护网了嘛&#xff0c;如火如荼的报名ing&#xff01;&#xff01;&#xff01;那么小编就来查缺补漏一下以前的web漏洞&#xff0c;也顺便去收录一波poc&#xff01;&#xff01;&#xff01;&#xff01; 今天讲的主人公呢就是SSRF&#xff0c;以前学的时候…

【leetcode C++】滑动窗口

1. LCR 008. 长度最小的子数组 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 题目…

如何自动申请免费的HTTPS证书?

在购买域名的时候我相信很多人都遇到了对于证书的问题&#xff0c;之前我也是使用阿里云的免费一年的证书&#xff0c;那时候感觉还好&#xff0c;一年更换一次&#xff0c;但是近期阿里云对于证书的过期时间直接砍到了三个月&#xff01;让我难以接受&#xff0c;所以我在想吧…

WPF中动画教程(DoubleAnimation的基本使用)

实现效果 今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用。该小球会移动到我们鼠标左键或右键点击的地方。 该示例的实现效果如下所示&#xff1a; 页面设计 xaml如下所示&#xff1a; <Window x:Class"AnimationDemo.MainWindow&qu…

Harbor私有镜像仓库搭建

一、介绍 Docker容器应用的开发和运行路不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境的Registry也是非常必要的。 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&a…