端口映射的基本概念
端口映射是一种网络技术,可以将外部网络的请求通过指定端口转发到内部网络的设备或应用上。端口映射让外网设备能够通过某个外部端口访问内网服务,形成跨网络的通信桥梁。
开发环境中的端口映射需求
在开发环境中,特别是当使用远程开发机(如通过 Web IDE 进行开发)时,可能会遇到代理或网络访问的限制。外部资源在直接访问开发机的 HTTP/HTTPS 服务时,可能因为代理设置而无法正常加载资源,导致服务或界面无法正常显示。这种情况下,端口映射可以帮助我们在本地访问开发机的服务,避免代理干扰。
解决 Web 应用加载问题
通过端口映射,可以将运行 web_demo 的远程端口映射到本地计算机上,让我们可以在本地访问开发机的服务。这样,开发机的 Web UI 不直接暴露给外部,而是通过本地端口访问,避免因网络代理影响到资源加载的问题,从而实现更顺畅的界面访问。
端口映射在部署实践中的作用
在实际的 web_demo 模型部署实践中,我们可以利用端口映射将开发机中的服务端口(例如 Web UI 端口)映射到本地,这样既避免了代理问题,又确保了资源能够完整加载,提升了开发和调试的便利性。
以书生大模型实战营为例 :
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no
- 该命令建立了一个 SSH 隧道,将本地的 7860 端口通过 SSH 隧道转发到远程主机 127.0.0.1:7860。这样,在本地访问 127.0.0.1:7860 时,数据会通过 SSH 隧道传送到 ssh.intern-ai.org.cn 服务器上的 127.0.0.1:7860,适合远程访问内网资源,且不需要开放外部端口。
当你运行一个web demo的时候,就可以使用这个命令进行端口映射,举个例子:
我们创建一个hello_world.py文件,在文件中填入以下内容:
import socket
import re
import gradio as gr
# 获取主机名
def get_hostname():
hostname = socket.gethostname()
match = re.search(r'-(\d+)$', hostname)
name = match.group(1)
return name
# 创建 Gradio 界面
with gr.Blocks(gr.themes.Soft()) as demo:
html_code = f"""
<p align="center">
<a href="https://intern-ai.org.cn/home">
<img src="https://intern-ai.org.cn/assets/headerLogo-4ea34f23.svg" alt="Logo" width="20%" style="border-radius: 5px;">
</a> _
</p>
<h1 style="text-align: center;">☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!</h1>
<h2 style="text-align: center;">😀 Let’s go on a journey through ShuSheng Island together.</h2>
<p align="center">
<a href="https://github.com/InternLM/Tutorial/blob/camp3">
<img src="https://oss.lingkongstudy.com.cn/blog/202410081252022.png" alt="Logo" width="50%" style="border-radius: 5px;">
</a>
</p>
"""
gr.Markdown(html_code)
demo.launch()`` `
然后再运行 python hello_world.py
可以通过网址 http://127.0.0.1:7860/
查看
同时还可以使用VScode进行端口映射
补充:
Docker 中也经常使用端口转发(或端口映射)来将容器内的端口映射到宿主机(Host)上,使得容器中的服务可以被外部访问。通过端口转发,Docker 可以将容器内的应用暴露到宿主机的指定端口上,类似于 SSH 中的端口映射功能。
docker run -p [宿主机端口]:[容器端口] [镜像名称]
比如docker run -d -p 8080:80 nginx
docker run:运行一个新的 Docker 容器。
-d:以后台模式运行容器。
-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。
nginx:运行的镜像是 nginx。
vi常用命令:
cp命令在后面会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:
复制文件:cp 源文件 目标文件
复制目录:cp -r 源目录 目标目录
但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln
命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
所以我们一般使用软连接,它的常用的使用方法如下:ln [参数][源文件或目录][目标文件或目录]
- 参数
-s
:创建软链接(符号链接)也是最常用的;
find命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目录及其子目录中查找符合条件的文件或目录,并执行相应的操作。
find
命令的一些常见用法:
按文件名查找:使用-name选项按照文件名查找文件。例如,find /path/to/directory -name "file.txt"将在指定目录及其子目录中查找名为file.txt的文件。
按文件类型查找:使用-type选项按照文件类型查找文件。例如,find /path/to/directory -type f将查找指定目录及其子目录中的所有普通文件。
按文件大小查找:使用-size选项按照文件大小查找文件。例如,find /path/to/directory -size +100M将查找指定目录及其子目录中大于100MB的文件。
sed
是一个功能强大的流编辑器,常用于文本处理,比如文件内容替换、插入、删除等操作。它在 Linux 和 Unix 系统中非常常见,能够帮助自动化和批量化的文本处理工作。
sed [选项] '命令' 文件名
- [选项]:指定sed的执行选项,例如是否打印输出。
- ‘命令’:指定要执行的 sed 操作,比如添加、删除、替换等。
- 文件名:要处理的文件。
-
替换文本(s)
s
表示替换,g表示全局替换sed 's/old/new/g example.txt'
-
删除行(d)
d
用于删除指定的行sed '4d' example.txt
删除空行sed '/^$/d example.txt'