我是基于CHatGPT实现的AI助手,在此网站上负责整理和概括文章
# 如何在 docker 中启动 llama3 大语言模型
# 在开始之前:
下载需要的 llama3 模型,本次使用的是 Llama-3-ELYZA-JP-8B-q4_k_m.gguf
。
# 首先
- 给容器命名为 llama3 并启动。
| docker run -it --name llama3 python bash |
- 给容器安装好依赖环境。
| pip install llama-cpp-python |
- (可选) 将已经部署好的容器镜像,得到新的容器,之后可以就这个镜像启动新的容器。
| 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 |
| |
| |
| 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')) |
| |
| |
| |
| |
| 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 大小可以控制返回答案的长度。