Loading...

我是基于CHatGPT实现的AI助手,在此网站上负责整理和概括文章

# 如何在 docker 中启动 llama3 大语言模型

# 在开始之前:

下载需要的 llama3 模型,本次使用的是 Llama-3-ELYZA-JP-8B-q4_k_m.gguf

# 首先

  1. 给容器命名为 llama3 并启动。
docker run -it --name llama3 python bash
  1. 给容器安装好依赖环境。
pip install llama-cpp-python
  1. (可选) 将已经部署好的容器镜像,得到新的容器,之后可以就这个镜像启动新的容器。
docker commit llama3 llama3i

# 将模型文件转移到容器中

docker run -it -v C:\Users\topkd\Downloads\Llama-3-ELYZA-JP-8B-q4_k_m.gguf:/wk/Llama-3-ELYZA-JP-8B-q4_k_m -w /wk llama3i bash

这里是我的模型文件路径 C:\Users\topkd\Downloads\Llama-3-ELYZA-JP-8B-q4_k_m.gguf 需要修改成自己的路径,以及

# 调用代码

from llama_cpp import Llama
# 创建 Llama 模型的实例
llm = Llama(model_path="Llama-3-ELYZA-JP-8B-q4_k_m.gguf")
def ask_question():
    while True:
        # 获取用户输入的问题
        question = input("请输入你的问题 (或输入 'exit' 退出): ")
        
        # 判断是否退出
        if question.lower() == "exit":
            print("感谢使用,再见!")
            break
        
        # 生成模型的回答
        response = llm(question, max_tokens=150)
        
        # 提取并输出回答
        answer = response['choices'][0]['text']
        print("模型的回答: ", answer.strip())
# 启动问答循环
ask_question()

这样就可以进行问答了,还可以创建网页端问答。

# 网页问答

# 启动 docker 并且使用 GPU 加速

docker run -it --rm --gpus -p 8000:8000 -v %cd%:/wk -w /wk llama3i python llamasvr.py

llamasvr.py 的源文件:

from http.server import BaseHTTPRequestHandler, HTTPServer
import json
import html
import urllib
from llama_cpp import Llama
class LlamaServer(BaseHTTPRequestHandler):
    llm = Llama(model_path="./Llama-3-ELYZA-JP-8B-q4_k_m.gguf", n_ctx=1024) 
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(b"""
            <html>
		<head>
<meta charset="UTF-8">
		</head>
            <body>
                <h1>LLAMASVR</h1>
                <form method="POST" action="">
                    <textarea name="input_text" placeholder="Enter your prompt here..."></textarea><br>
                    <input type="submit" value="Submit">
                </form>
            </body>
            </html>
        """)
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        post_str = urllib.parse.unquote(post_data.decode('utf-8'))
        # llama_cpp_python 銈掍娇鐢ㄣ仐銇︺儣銉兂銉椼儓銇嬨倝銉偣銉濄兂銈广倰鐢熸垚
        # 鐢熸垚銇曘倢銇熸枃瀛楀垪銈掕繑銇�
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("<head><meta charset=\"UTF-8\"></head>".encode('utf-8'))
        ss=[post_str.split("=")[1]]
        for _ in range(5):
            self.wfile.write(ss[-1].encode('utf-8'))
            ss.append(self.llm(''.join(ss))['choices'][0]['text'])
        self.wfile.write(ss[-1].encode('utf-8'))
def run(server_class=HTTPServer, handler_class=LlamaServer, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting LlamaServer on port {port}...")
    httpd.serve_forever()
if __name__ == "__main__":
    run()

其中修改 cla ss LlamaServer(BaseHTTPRequestHandler): llm = Llama(model_path="./Llama-3-ELYZA-JP-8B-q4_k_m.gguf", n_ctx=1024) 的 ctx 大小可以控制返回答案的长度。