llama-cpp-python

文章目录

    • 一、关于 llama-cpp-python
    • 二、安装
      • 安装配置
      • 支持的后端
      • Windows 笔记
      • MacOS笔记
      • 升级和重新安装
    • 三、高级API
      • 1、简单示例
      • 2、从 Hugging Face Hub 中提取模型
      • 3、聊天完成
      • 4、JSON和JSON模式
        • JSON模式
        • JSON Schema 模式
      • 5、函数调用
      • 6、多模态模型
      • 7、Speculative Decoding
      • 8、Embeddings
      • 9、调整上下文窗口
    • 四、OpenAI兼容Web服务器
      • Web服务器功能
    • 五、Docker镜像
    • 六、低级API
    • 七、发展
    • 八、常见问题解答
      • 是否有预构建的二进制/二进制轮子可用?
      • 这与llama. cpp`llama.cpp`相比如何?
      • 许可证


一、关于 llama-cpp-python

Python bindings for llama.cpp

  • github : https://github.com/abetlen/llama-cpp-python
  • 文档:https://llama-cpp-python.readthedocs.io/en/latest/

简单的Python绑定**@ggerganov的** llama.cpp库。 该套餐提供:

  • 通过ctypes接口对C API的低级访问。
    • 类似OpenAI的API
    • 区块链兼容性
    • LlamaIndex兼容性
    • 本地副驾驶更换
    • 函数调用支持
    • 视觉API支持
    • 多种型号

文件可在https://llama-cpp-python.readthedocs.io/en/latest查阅。


二、安装

要求:

  • Python 3.8+
    • Linux:gcc或clang
    • Windows:Visual Studio或MinGW
    • MacOS: Xcode

要安装包,请运行:

pip install llama-cpp-python

这也将从源代码构建llama.cpp并将其与此python包一起安装。

如果失败,请将--verbose添加到pip install中,请参阅完整的cmake构建日志。


预制 Whell (新)

也可以安装具有基本CPU支持的预构建轮子。

pip install llama-cpp-python \--extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu

安装配置

llama.cpp支持许多硬件加速后端以加速推理以及后端特定选项。有关完整列表,请参阅llama.cpp自述文件。

所有llama.cppcmake构建选项都可以在安装过程中通过CMAKE_ARGS环境变量或--config-settings / -Ccli标志进行设置。


环境变量

# Linux and Mac
CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS" \pip install llama-cpp-python

# Windows
$env:CMAKE_ARGS = "-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS"
pip install llama-cpp-python

CLI / requirements.txt

也可以通过 pip install -C / --config-settings 命令设置 和保存到 requirements.txt 文件:

pip install --upgrade pip # ensure pip is up to date
pip install llama-cpp-python \-C cmake.args="-DGGML_BLAS=ON;-DGGML_BLAS_VENDOR=OpenBLAS"

# requirements.txtllama-cpp-python -C cmake.args="-DGGML_BLAS=ON;-DGGML_BLAS_VENDOR=OpenBLAS"

支持的后端

以下是一些常见的后端、它们的构建命令和所需的任何其他环境变量。

OpenBLAS (CPU)
To install with OpenBLAS, set the GGML_BLAS and GGML_BLAS_VENDOR environment variables before installing:

CMAKE_ARGS="-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS" pip install llama-cpp-python

CUDA、Metal、hipBLAS (ROCm)、Vulkan、SYCL、RPC 等,不一一列举


Windows 笔记


MacOS笔记

详细的MacOS金属GPU安装留档可在docs/install/macos.md


升级和重新安装

要升级和重建llama-cpp-python,请添加--upgrade --force-reinstall --no-cache-dir标志到pip install命令以确保从源代码重建包。


三、高级API

API参考

高级API通过Llama 类提供简单的托管接口。


1、简单示例

下面是一个简短的示例,演示了如何使用高级API来完成基本文本:

from llama_cpp import Llamallm = Llama(model_path="./models/7B/llama-model.gguf",# n_gpu_layers=-1, # Uncomment to use GPU acceleration# seed=1337, # Uncomment to set a specific seed# n_ctx=2048, # Uncomment to increase the context window
)
output = llm("Q: Name the planets in the solar system? A: ", # Promptmax_tokens=32, # Generate up to 32 tokens, set to None to generate up to the end of the context windowstop=["Q:", "\n"], # Stop generating just before the model would generate a new questionecho=True # Echo the prompt back in the output
) # Generate a completion, can also call create_completion
print(output)

默认情况下llama-cpp-python以OpenAI兼容格式生成完成:

{"id": "cmpl-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","object": "text_completion","created": 1679561337,"model": "./models/7B/llama-model.gguf","choices": [{"text": "Q: Name the planets in the solar system? A: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune and Pluto.","index": 0,"logprobs": None,"finish_reason": "stop"}],"usage": {"prompt_tokens": 14,"completion_tokens": 28,"total_tokens": 42}
}

可以通过Llama类的__call__create_completion方法完成文本。


2、从 Hugging Face Hub 中提取模型

您可以使用from_pretrained方法直接从 Hugging Face 下载gguf格式的Llama模型。
您需要安装huggingface-hub软件包才能使用此功能(pip install huggingface-hub)。

llm = Llama.from_pretrained(repo_id="Qwen/Qwen2-0.5B-Instruct-GGUF",filename="*q8_0.gguf",verbose=False
)

默认情况下from_pretrained会将模型下载到huggingface缓存目录,然后您可以使用huggingface-cli工具管理已安装的模型文件。


3、聊天完成

高级API还提供了一个简单的聊天完成界面。

聊天完成要求模型知道如何将消息格式化为单个提示。 这个Llama类使用预先注册的聊天格式(即chatmlllama-2gemma等)或通过提供自定义聊天处理程序对象来实现这一点。


该模型将使用以下优先顺序将消息格式化为单个提示:

  • 使用chat_handler如果提供
  • 使用chat_format如果提供
  • 使用tokenizer.chat_template来自gguf模型的元数据(应该适用于大多数新模型,旧模型可能没有这个)
  • 否则就回到llama-2聊天模式

设置verbose=True以查看选定的聊天格式。

from llama_cpp import Llama
llm = Llama(model_path="path/to/llama-2/llama-model.gguf",chat_format="llama-2"
)
llm.create_chat_completion(messages = [{"role": "system", "content": "You are an assistant who perfectly describes images."},{"role": "user","content": "Describe this image in detail please."}]
)

可以通过Llama类的create_chat_completion方法完成聊天。

对于OpenAI API v1兼容性,您可以使用create_chat_completion_openai_v1方法,该方法将返回pydatic模型而不是dicts。


4、JSON和JSON模式

要将聊天响应限制为仅有效的JSON或特定的JSON架构,请使用create_chat_completion中的response_format参数。


JSON模式

以下示例将仅将响应限制为有效的JSON字符串。

from llama_cpp import Llama
llm = Llama(model_path="path/to/model.gguf", chat_format="chatml")
llm.create_chat_completion(messages=[{"role": "system","content": "You are a helpful assistant that outputs in JSON.",},{"role": "user", "content": "Who won the world series in 2020"},],response_format={"type": "json_object",},temperature=0.7,
)

JSON Schema 模式

要将响应进一步限制为特定的JSON Schema,请将模式添加到response_format参数的schema属性中。

from llama_cpp import Llama
llm = Llama(model_path="path/to/model.gguf", chat_format="chatml")
llm.create_chat_completion(messages=[{"role": "system","content": "You are a helpful assistant that outputs in JSON.",},{"role": "user", "content": "Who won the world series in 2020"},],response_format={"type": "json_object","schema": {"type": "object","properties": {"team_name": {"type": "string"}},"required": ["team_name"],},},temperature=0.7,
)

5、函数调用

高级API支持OpenAI兼容的函数和工具调用。
这可以通过functionary预训练模型聊天格式或通用chatml-function-calling聊天格式实现。

from llama_cpp import Llama
llm = Llama(model_path="path/to/chatml/llama-model.gguf", chat_format="chatml-function-calling")
llm.create_chat_completion(messages = [{"role": "system","content": "A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. The assistant calls functions with appropriate input when necessary"},{"role": "user","content": "Extract Jason is 25 years old"}],tools=[{"type": "function","function": {"name": "UserDetail","parameters": {"type": "object","title": "UserDetail","properties": {"name": {"title": "Name","type": "string"},"age": {"title": "Age","type": "integer"}},"required": [ "name", "age" ]}}}],tool_choice={"type": "function","function": {"name": "UserDetail"}}
)

6、多模态模型

llama-cpp-python支持诸如llava1.5之类的功能,它允许语言模型从文本和图像中读取信息。

以下是支持的多模式模型及其各自的聊天处理程序(Python API)和聊天格式(Server API)。

ModelLlamaChatHandlerchat_format
llava-v1.5-7bLlava15ChatHandlerllava-1-5
llava-v1.5-13bLlava15ChatHandlerllava-1-5
llava-v1.6-34bLlava16ChatHandlerllava-1-6
moondream2MoondreamChatHandlermoondream2
nanollavaNanollavaChatHandlernanollava
llama-3-vision-alphaLlama3VisionAlphaChatHandlerllama-3-vision-alpha

然后,您需要使用自定义聊天处理程序来加载剪辑模型并处理聊天消息和图像。

from llama_cpp import Llama
from llama_cpp.llama_chat_format import Llava15ChatHandler
chat_handler = Llava15ChatHandler(clip_model_path="path/to/llava/mmproj.bin")
llm = Llama(model_path="./path/to/llava/llama-model.gguf",chat_handler=chat_handler,n_ctx=2048, # n_ctx should be increased to accommodate the image embedding
)
llm.create_chat_completion(messages = [{"role": "system", "content": "You are an assistant who perfectly describes images."},{"role": "user","content": [{"type" : "text", "text": "What's in this image?"},{"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" } }]}]
)

还可以使用from_pretrained方法从HugingFace Hub中提取模型。

from llama_cpp import Llama
from llama_cpp.llama_chat_format import MoondreamChatHandlerchat_handler = MoondreamChatHandler.from_pretrained(repo_id="vikhyatk/moondream2",filename="*mmproj*",
)llm = Llama.from_pretrained(repo_id="vikhyatk/moondream2",filename="*text-model*",chat_handler=chat_handler,n_ctx=2048, # n_ctx should be increased to accommodate the image embedding
)response = llm.create_chat_completion(messages = [{"role": "user","content": [{"type" : "text", "text": "What's in this image?"},{"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" } }]}]
)
print(response["choices"][0]["text"])

注意:多模态模型还支持工具调用和JSON模式。

def image_to_base64_data_uri(file_path):with open(file_path, "rb") as img_file:base64_data = base64.b64encode(img_file.read()).decode('utf-8')return f"data:image/png;base64,{base64_data}"# Replace 'file_path.png' with the actual path to your PNG file
file_path = 'file_path.png'
data_uri = image_to_base64_data_uri(file_path)messages = [{"role": "system", "content": "You are an assistant who perfectly describes images."},{"role": "user","content": [{"type": "image_url", "image_url": {"url": data_uri }},{"type" : "text", "text": "Describe this image in detail please."}]}
]

7、Speculative Decoding

llama-cpp-python支持推测解码,允许模型基于草稿模型生成完成。

使用推测解码的最快方法是通过LlamaPromptLookupDecoding类。

只需要在初始化的时候,传递这个 draft 模型到 Llama

from llama_cpp import Llama
from llama_cpp.llama_speculative import LlamaPromptLookupDecodingllama = Llama(model_path="path/to/model.gguf",draft_model=LlamaPromptLookupDecoding(num_pred_tokens=10) # num_pred_tokens is the number of tokens to predict 10 is the default and generally good for gpu, 2 performs better for cpu-only machines.
)

8、Embeddings

生成文本嵌入,使用 create_embeddingembed
注意,你需要传递 embedding=True 给构造器,在模型创建后,这些功能才能正常工作。

import llama_cppllm = llama_cpp.Llama(model_path="path/to/model.gguf", embedding=True)embeddings = llm.create_embedding("Hello, world!")# or create multiple embeddings at onceembeddings = llm.create_embedding(["Hello, world!", "Goodbye, world!"])

Transformer-style模型中的嵌入有两个主要概念:令牌级和序列级。序列级嵌入是通过将令牌级嵌入“池化”在一起产生的,通常是通过平均它们或使用第一个令牌。

默认情况下,明确面向嵌入的模型通常会返回序列级嵌入,每个输入字符串一个。非嵌入模型(例如为文本生成设计的模型)通常只返回令牌级嵌入,每个序列中的每个令牌一个。因此,对于令牌级嵌入,返回类型的维度将更高。

在某些情况下,可以使用模型创建时的pooling_type标志来控制池化行为。您可以使用LLAMA_POOLING_TYPE_NONE确保来自任何模型的令牌级嵌入。相反,获得面向生成的模型来产生序列级嵌入目前是不可能的,但您始终可以手动进行池化。


9、调整上下文窗口

Llama模型的上下文窗口决定了一次可以处理的最大令牌数量。默认情况下,这设置为512个令牌,但可以根据您的要求进行调整。

例如,如果您想使用更大的上下文,您可以在初始化Llama对象时通过设置n_ctx参数来展开上下文窗口:

llm = Llama(model_path="./models/7B/llama-model.gguf", n_ctx=2048)

四、OpenAI兼容Web服务器

llama-cpp-python提供了一个Web服务器,旨在作为OpenAI API的直接替代品。 这允许您将llama. cpp兼容模型与任何OpenAI兼容客户端(语言库、服务等)一起使用。

要安装服务器包并开始使用:

pip install 'llama-cpp-python[server]'
python3 -m llama_cpp.server --model models/7B/llama-model.gguf

与上面的硬件加速部分类似,您还可以安装支持GPU(cuBLAS)的产品,如下所示:

CMAKE_ARGS="-DGGML_CUDA=on" FORCE_CMAKE=1 pip install 'llama-cpp-python[server]'
python3 -m llama_cpp.server --model models/7B/llama-model.gguf --n_gpu_layers 35

导航到http://localhost:8000/docs以查看OpenAPI留档。

要绑定到0.0.0.0以启用远程连接,请使用python3 -m llama_cpp.server --host 0.0.0.0。 同样,要更改端口(默认为8000),请使用--port

您可能还想设置提示格式。对于chat ml,使用

python3 -m llama_cpp.server --model models/7B/llama-model.gguf --chat_format chatml

这将根据模型期望的方式格式化提示。您可以在模型卡中找到提示格式。 有关可能的选项,请参阅llama_cpp/llama_chat_format.py并查找以“@register_chat_format”开头的行。

如果安装了huggingface-hub,还可以使用--hf_model_repo_id标志从HuggingFace Hub加载模型。

python3 -m llama_cpp.server --hf_model_repo_id Qwen/Qwen2-0.5B-Instruct-GGUF --model '*q8_0.gguf'

Web服务器功能

  • 本地副驾驶更换
  • 函数调用支持
  • 视觉API支持
  • 多种型号

五、Docker镜像

Docker映像可在GHRC上获得。要运行服务器:

docker run --rm -it -p 8000:8000 -v /path/to/models:/models -e MODEL=/models/llama-model.gguf ghcr.io/abetlen/llama-cpp-python:latest

termux上的Docker(需要root)是目前唯一已知的在手机上运行它的方法,请参阅termux支持问题


六、低级API

API参考

低级API是直接绑定到llama.cpp提供的C API的ctypes。 整个低级API可以在llama_cpp/llama_cpp.py中找到,并直接反映llama. h中的C API。

下面是一个简短的示例,演示了如何使用低级API对提示进行标记:

import llama_cpp
import ctypes
llama_cpp.llama_backend_init(False) # Must be called once at the start of each program
params = llama_cpp.llama_context_default_params()
# use bytes for char * params
model = llama_cpp.llama_load_model_from_file(b"./models/7b/llama-model.gguf", params)
ctx = llama_cpp.llama_new_context_with_model(model, params)
max_tokens = params.n_ctx
# use ctypes arrays for array params
tokens = (llama_cpp.llama_token * int(max_tokens))()
n_tokens = llama_cpp.llama_tokenize(ctx, b"Q: Name the planets in the solar system? A: ", tokens, max_tokens, llama_cpp.c_bool(True))
llama_cpp.llama_free(ctx)

查看示例文件夹以获取更多使用低级API的示例。


七、发展

该一揽子计划正在积极开发中,我欢迎任何贡献。

要开始使用,请克隆存储库并以可编辑/开发模式安装包:

git clone --recurse-submodules https://github.com/abetlen/llama-cpp-python.git
cd llama-cpp-python# Upgrade pip (required for editable mode)
pip install --upgrade pip# Install with pip
pip install -e .# if you want to use the fastapi / openapi server
pip install -e .[server]# to install all optional dependencies
pip install -e .[all]# to clear the local build cache
make clean

您还可以测试lama.cpp的特定提交,方法是在vendor/llama.cpp子模块中签出所需的提交,然后再次运行make cleanpip install -e .llama.hAPI中的任何更改都需要 更改llama_cpp/llama_cpp.py文件以匹配新API(其他地方可能需要其他更改)。


八、常见问题解答


是否有预构建的二进制/二进制轮子可用?

推荐的安装方法是从源代码安装,如上所述。 这样做的原因是llama.cpp是使用特定于您的系统的编译器优化构建的。 使用预构建的二进制文件需要禁用这些优化或为每个平台支持大量预构建的二进制文件。

话虽如此,有一些预构建的二进制文件可通过版本以及一些社区提供的轮子获得。

在未来,我愿意为通用平台提供预构建的二进制文件和轮子,我很乐意接受在这一领域的任何有用的贡献。 这目前正在跟踪#741


这与llama. cppllama.cpp相比如何?

我最初编写这个包是为了自己使用,有两个目标:

  • 提供一个简单的过程来安装llama.cpp并从Python访问llama.h中的完整C API
  • 提供高级Python API,可用作OpenAI API的直接替代品,以便可以轻松移植现有应用程序以使用llama.cpp

对该一揽子计划的任何贡献和更改都将牢记这些目标。


许可证

该项目根据MIT许可条款获得许可。


2024-07-16(二)

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

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

相关文章

【Leetcode】二十一、前缀树 + 词典中最长的单词

文章目录 1、背景2、前缀树Trie3、leetcode208:实现Trie4、leetcode720:词典中最长的单词 1、背景 如上,以浏览器搜索时的自动匹配为例: 如果把所有搜索关键字放一个数组里,则:插入、搜索一个词条时&#x…

SEO:6个避免被搜索引擎惩罚的策略-华媒舍

在当今数字时代,搜索引擎成为了绝大多数人获取信息和产品的首选工具。为了在搜索结果中获得良好的排名,许多网站采用了各种优化策略。有些策略可能会适得其反,引发搜索引擎的惩罚。以下是彭博社发稿推广的6个避免被搜索引擎惩罚的策略。 1. 内…

一文带你看懂SAP-HANA的基本架构与原理

注:本篇主要对SAP HANA做了总结与论述,如有错误欢迎读者提出并补充 创作不易,希望大家一键三连支持!!!♥♥♥ 创作不易,希望大家一键三连支持!!!♥♥♥ 创作不易,希望大家一键三连支持!!!♥♥♥ 目录 一. 背景引入1.1 硬件与数据库系统1.2 行业现状 …

AES Android IOS H5 加密方案

前景: 1、本项目原有功能RSA客户端对敏感信息进行加密 2、本次漏洞说是服务端返回值有敏感信息,需要密文返回 方案: 本次方案不算完美,还是有被劫持篡改的风险,但基本https证书认证加持,风险相对较小 …

对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

对Spring的理解 Spring是一个开源的Java平台,它提供了全面的基础设施支持,以便你可以更容易地开发Java应用程序。Spring解决了企业应用程序开发中的很多复杂性,提供了以下核心功能: - 依赖注入(IoC)&…

Camera XTS 处理笔记

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 常用测试步骤(下面均以CTS为例) 打开终端,进入 cts 包 tools目录下执行 ./cts-tradefed 进入cts测试 :~/XTS/CTS/14…

C++知识点总结(45):序列动态规划

序列动态规划 一、意义二、例题1. 最长上升子序列2. 合唱队形(加强版)3. 公共子序列4. 编辑距离 一、意义 动态规划(dynamic programming),将一个目标大问题“大事化小,小事化了”,分成很多的子…

永磁同步电机高性能控制算法(14)—— 有源阻尼电流环

1.前言 在之前的之后中已经发过一篇复矢量电流环和我们平时用的比较多的前馈补偿的电流环的对比,感觉复矢量电流环的效果还是挺明显的。 https://zhuanlan.zhihu.com/p/682880365https://zhuanlan.zhihu.com/p/682880365 当时在看文献的时候,复矢量电…

AI算法17-贝叶斯岭回归算法Bayesian Ridge Regression | BRR

贝叶斯岭回归算法简介 贝叶斯岭回归(Bayesian Ridge Regression)是一种回归分析方法,它结合了岭回归(Ridge Regression)的正则化特性和贝叶斯统计的推断能力。这种方法在处理具有大量特征的数据集时特别有用&#xff…

13、Shell自动化运维编程基础

弋.目录 RHCE板块一、为什么学习和使用Shell编程二、Shell是什么1、shell起源2、查看当前系统支持的shell3、查看当前系统默认shell4、Shell 概念 三、Shell 程序设计语言1、Shell 也是一种脚本语言2、用途 四、如何学好shell1、熟练掌握shell编程基础知识2、建议 五、Shell脚本…

英伟达股票1拆10后,现在再买入是否为时已晚?

英伟达股票1拆10后,现在再买入是否为时已晚? 英伟达的股价在过去18个月里已经上涨了近800% 人工智能领域无疑是当下最受投资者关注的焦点之一,而这一领域的佼佼者--英伟达,也被一些华尔街投资机构和看好半导体、数据中心行业的专业…

SoulApp创始人张璐团队以AI驱动社交进化,平台社交玩法大变革

在科技飞速发展的今天,人工智能正逐步渗透到社交媒体的各个环节,赋能全链路社交体验。AI的引入不仅提升了内容推荐的精准度,使用户能够更快速地发现感兴趣的内容,还能通过用户行为预测,帮助平台更好地理解和满足用户需求。此外,AI驱动的虚拟助手和聊天机器人也正在改变用户互动…

NVIDIA RTX 50系显卡接口全变,功耗爆炸超500W

七月伊始,手机圈就开始打的不可开交了。 例如真我 GT6、IQOO Neo 9S、以及蓄势待发的红米 K70 Ultra,都想在这个暑假向莘莘学子发出最诚挚的「邀请函」。 反观电脑圈这边,不能说一潭死水,只能说毫无波澜。 不过该来的还是要来的&…

Redis的使用(四)常见使用场景-缓存使用技巧

1.绪论 redis本质上就是一个缓存框架,所以我们需要研究如何使用redis来缓存数据,并且如何解决缓存中的常见问题,缓存穿透,缓存击穿,缓存雪崩,以及如何来解决缓存一致性问题。 2.缓存的优缺点 2.1 缓存的…

睿考网:造价员和造价工程师是一个意思吗?

在工程建设领域中,经常会有人问:“造价员和造价工程师是一样的吗?”这两者代表的是两种独立的职业身份,职责和资格要求有明显的差异,是两种完全不同的考试。 造价工程师是一种具有专业资质的人员,通过国家统一的执业…

『 Linux 』命名管道

文章目录 命名管道与匿名管道命名管道特点命名管道的理解命名管道实现两个毫无关联的进程间通信 命名管道与匿名管道 命名管道是管道的一种,数据流向为单向故被称为管道; 与匿名管道相同属于一种内存级文件; 区别如下: 名字 匿名管道 没有名字,只存在于内存当中(类似内核缓冲…

【软件测试】编写测试用例篇

前面部分主要是编写测试用例的方法和方向,后面一部分是编写出具体的测试用例 目录 什么是测试用例 1.设计测试用例的万能公式 1.1.从思维出发 1.2.万能公式 1.3.弱网测试 1.4.安装与卸载测试 2.设计测试用例的方法 2.1.基于需求的设计方法 2.2.等价类 2.3…

测试开发面经总结(三)

TCP三次握手 TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态 客户端会随机初始化序号&…

原来,BI数据分析也是有模板的

在当今数据驱动的时代,商业智能(BI)数据分析已经成为企业决策的重要工具。然而,很多人可能并不了解,BI数据分析并非从零开始,而是可以依托现成的模板和解决方案来快速搭建和实施的。以奥威BI方案为例&#…

kotlin get set

在 Kotlin 中,如果想实现一个类的属性可以从外部读取但不能修改,可以使用自定义的 getter 和 private setter。以下是一个示例代码: class MyClass {var myProperty: Stringprivate set // 使 setter 私有化,外部无法修改get // …