Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
edc6ac7297 | ||
|
|
e89e23621c | ||
|
|
6b9ec4c6fa | ||
|
|
ced0966ffc | ||
|
|
966b912013 | ||
|
|
dc71054e61 |
@@ -14,7 +14,7 @@ API兼容的接口,这意味着一切ChatGPT客户端都是RWKV客户端。
|
|||||||
|
|
||||||
[English](README.md) | 简体中文
|
[English](README.md) | 简体中文
|
||||||
|
|
||||||
[视频演示](https://www.bilibili.com/video/BV1hM4y1v76R) | [疑难解答](https://www.bilibili.com/read/cv23921171) | [预览](#Preview) | [下载][download-url]
|
[视频演示](https://www.bilibili.com/video/BV1hM4y1v76R) | [疑难解答](https://www.bilibili.com/read/cv23921171) | [预览](#Preview) | [下载][download-url] | [懒人包](https://pan.baidu.com/s/1wchIUHgne3gncIiLIeKBEQ?pwd=1111)
|
||||||
|
|
||||||
[license-image]: http://img.shields.io/badge/license-MIT-blue.svg
|
[license-image]: http://img.shields.io/badge/license-MIT-blue.svg
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import GPUtil
|
import GPUtil
|
||||||
import torch
|
import torch
|
||||||
import rwkv
|
import rwkv
|
||||||
import langchain
|
|
||||||
import fastapi
|
import fastapi
|
||||||
import uvicorn
|
import uvicorn
|
||||||
import sse_starlette
|
import sse_starlette
|
||||||
|
|||||||
@@ -115,13 +115,26 @@ The following is a coherent verbose detailed conversation between a girl named {
|
|||||||
while completion_lock.locked():
|
while completion_lock.locked():
|
||||||
if await request.is_disconnected():
|
if await request.is_disconnected():
|
||||||
requests_num = requests_num - 1
|
requests_num = requests_num - 1
|
||||||
|
print(f"{request.client} Stop Waiting (Lock)")
|
||||||
quick_log(
|
quick_log(
|
||||||
request, None, "Stop Waiting. RequestsNum: " + str(requests_num)
|
request,
|
||||||
|
None,
|
||||||
|
"Stop Waiting (Lock). RequestsNum: " + str(requests_num),
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
await asyncio.sleep(0.1)
|
await asyncio.sleep(0.1)
|
||||||
else:
|
else:
|
||||||
completion_lock.acquire()
|
completion_lock.acquire()
|
||||||
|
if await request.is_disconnected():
|
||||||
|
completion_lock.release()
|
||||||
|
requests_num = requests_num - 1
|
||||||
|
print(f"{request.client} Stop Waiting (Lock)")
|
||||||
|
quick_log(
|
||||||
|
request,
|
||||||
|
None,
|
||||||
|
"Stop Waiting (Lock). RequestsNum: " + str(requests_num),
|
||||||
|
)
|
||||||
|
return
|
||||||
set_rwkv_config(model, global_var.get(global_var.Model_Config))
|
set_rwkv_config(model, global_var.get(global_var.Model_Config))
|
||||||
set_rwkv_config(model, body)
|
set_rwkv_config(model, body)
|
||||||
if body.stream:
|
if body.stream:
|
||||||
@@ -184,14 +197,20 @@ The following is a coherent verbose detailed conversation between a girl named {
|
|||||||
break
|
break
|
||||||
# torch_gc()
|
# torch_gc()
|
||||||
requests_num = requests_num - 1
|
requests_num = requests_num - 1
|
||||||
|
completion_lock.release()
|
||||||
|
if await request.is_disconnected():
|
||||||
|
print(f"{request.client} Stop Waiting")
|
||||||
|
quick_log(
|
||||||
|
request,
|
||||||
|
body,
|
||||||
|
response + "\nStop Waiting. RequestsNum: " + str(requests_num),
|
||||||
|
)
|
||||||
|
return
|
||||||
quick_log(
|
quick_log(
|
||||||
request,
|
request,
|
||||||
body,
|
body,
|
||||||
response + "\nFinished. RequestsNum: " + str(requests_num),
|
response + "\nFinished. RequestsNum: " + str(requests_num),
|
||||||
)
|
)
|
||||||
completion_lock.release()
|
|
||||||
if await request.is_disconnected():
|
|
||||||
return
|
|
||||||
yield {
|
yield {
|
||||||
"response": response,
|
"response": response,
|
||||||
"model": "rwkv",
|
"model": "rwkv",
|
||||||
@@ -213,7 +232,6 @@ The following is a coherent verbose detailed conversation between a girl named {
|
|||||||
try:
|
try:
|
||||||
return await eval_rwkv().__anext__()
|
return await eval_rwkv().__anext__()
|
||||||
except StopAsyncIteration:
|
except StopAsyncIteration:
|
||||||
print(f"{request.client} Stop Waiting")
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@@ -241,13 +259,26 @@ async def completions(body: CompletionBody, request: Request):
|
|||||||
while completion_lock.locked():
|
while completion_lock.locked():
|
||||||
if await request.is_disconnected():
|
if await request.is_disconnected():
|
||||||
requests_num = requests_num - 1
|
requests_num = requests_num - 1
|
||||||
|
print(f"{request.client} Stop Waiting (Lock)")
|
||||||
quick_log(
|
quick_log(
|
||||||
request, None, "Stop Waiting. RequestsNum: " + str(requests_num)
|
request,
|
||||||
|
None,
|
||||||
|
"Stop Waiting (Lock). RequestsNum: " + str(requests_num),
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
await asyncio.sleep(0.1)
|
await asyncio.sleep(0.1)
|
||||||
else:
|
else:
|
||||||
completion_lock.acquire()
|
completion_lock.acquire()
|
||||||
|
if await request.is_disconnected():
|
||||||
|
completion_lock.release()
|
||||||
|
requests_num = requests_num - 1
|
||||||
|
print(f"{request.client} Stop Waiting (Lock)")
|
||||||
|
quick_log(
|
||||||
|
request,
|
||||||
|
None,
|
||||||
|
"Stop Waiting (Lock). RequestsNum: " + str(requests_num),
|
||||||
|
)
|
||||||
|
return
|
||||||
set_rwkv_config(model, global_var.get(global_var.Model_Config))
|
set_rwkv_config(model, global_var.get(global_var.Model_Config))
|
||||||
set_rwkv_config(model, body)
|
set_rwkv_config(model, body)
|
||||||
if body.stream:
|
if body.stream:
|
||||||
@@ -304,14 +335,20 @@ async def completions(body: CompletionBody, request: Request):
|
|||||||
break
|
break
|
||||||
# torch_gc()
|
# torch_gc()
|
||||||
requests_num = requests_num - 1
|
requests_num = requests_num - 1
|
||||||
|
completion_lock.release()
|
||||||
|
if await request.is_disconnected():
|
||||||
|
print(f"{request.client} Stop Waiting")
|
||||||
|
quick_log(
|
||||||
|
request,
|
||||||
|
body,
|
||||||
|
response + "\nStop Waiting. RequestsNum: " + str(requests_num),
|
||||||
|
)
|
||||||
|
return
|
||||||
quick_log(
|
quick_log(
|
||||||
request,
|
request,
|
||||||
body,
|
body,
|
||||||
response + "\nFinished. RequestsNum: " + str(requests_num),
|
response + "\nFinished. RequestsNum: " + str(requests_num),
|
||||||
)
|
)
|
||||||
completion_lock.release()
|
|
||||||
if await request.is_disconnected():
|
|
||||||
return
|
|
||||||
yield {
|
yield {
|
||||||
"response": response,
|
"response": response,
|
||||||
"model": "rwkv",
|
"model": "rwkv",
|
||||||
@@ -330,5 +367,4 @@ async def completions(body: CompletionBody, request: Request):
|
|||||||
try:
|
try:
|
||||||
return await eval_rwkv().__anext__()
|
return await eval_rwkv().__anext__()
|
||||||
except StopAsyncIteration:
|
except StopAsyncIteration:
|
||||||
print(f"{request.client} Stop Waiting")
|
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -137,5 +137,6 @@
|
|||||||
"MacOS is not supported yet, please convert manually.": "暂不支持MacOS, 请手动转换",
|
"MacOS is not supported yet, please convert manually.": "暂不支持MacOS, 请手动转换",
|
||||||
"Microsoft Visual C++ Redistributable is not installed, would you like to download it?": "微软VC++组件未安装, 是否下载?",
|
"Microsoft Visual C++ Redistributable is not installed, would you like to download it?": "微软VC++组件未安装, 是否下载?",
|
||||||
"Path Cannot Contain Space": "路径不能包含空格",
|
"Path Cannot Contain Space": "路径不能包含空格",
|
||||||
"Failed to switch model, please try starting the program with administrator privileges.": "切换模型失败, 请尝试以管理员权限启动程序"
|
"Failed to switch model, please try starting the program with administrator privileges.": "切换模型失败, 请尝试以管理员权限启动程序",
|
||||||
|
"Current Strategy": "当前Strategy"
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
BIN
frontend/src/assets/images/strategy.jpg
Normal file
BIN
frontend/src/assets/images/strategy.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 132 KiB |
BIN
frontend/src/assets/images/strategy_zh.jpg
Normal file
BIN
frontend/src/assets/images/strategy_zh.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
@@ -5,17 +5,23 @@ import classnames from 'classnames';
|
|||||||
export const Labeled: FC<{
|
export const Labeled: FC<{
|
||||||
label: string;
|
label: string;
|
||||||
desc?: string | null,
|
desc?: string | null,
|
||||||
|
descComponent?: ReactElement,
|
||||||
content: ReactElement,
|
content: ReactElement,
|
||||||
flex?: boolean,
|
flex?: boolean,
|
||||||
spaceBetween?: boolean,
|
spaceBetween?: boolean,
|
||||||
breakline?: boolean
|
breakline?: boolean,
|
||||||
|
onMouseEnter?: () => void
|
||||||
|
onMouseLeave?: () => void
|
||||||
}> = ({
|
}> = ({
|
||||||
label,
|
label,
|
||||||
desc,
|
desc,
|
||||||
|
descComponent,
|
||||||
content,
|
content,
|
||||||
flex,
|
flex,
|
||||||
spaceBetween,
|
spaceBetween,
|
||||||
breakline
|
breakline,
|
||||||
|
onMouseEnter,
|
||||||
|
onMouseLeave
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<div className={classnames(
|
<div className={classnames(
|
||||||
@@ -24,11 +30,11 @@ export const Labeled: FC<{
|
|||||||
breakline ? 'flex-col' : '',
|
breakline ? 'flex-col' : '',
|
||||||
spaceBetween && 'justify-between')
|
spaceBetween && 'justify-between')
|
||||||
}>
|
}>
|
||||||
{desc ?
|
{(desc || descComponent) ?
|
||||||
<Tooltip content={desc} showDelay={0} hideDelay={0} relationship="description">
|
<Tooltip content={descComponent ? descComponent : desc!} showDelay={0} hideDelay={0} relationship="description">
|
||||||
<Label>{label}</Label>
|
<Label onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>{label}</Label>
|
||||||
</Tooltip> :
|
</Tooltip> :
|
||||||
<Label>{label}</Label>
|
<Label onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>{label}</Label>
|
||||||
}
|
}
|
||||||
{content}
|
{content}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { v4 as uuid } from 'uuid';
|
|||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import { fetchEventSource } from '@microsoft/fetch-event-source';
|
import { fetchEventSource } from '@microsoft/fetch-event-source';
|
||||||
import { ConversationPair, getConversationPairs, Record } from '../utils/get-conversation-pairs';
|
import { ConversationPair, getConversationPairs, Record } from '../utils/get-conversation-pairs';
|
||||||
import logo from '../../../build/appicon.jpg';
|
import logo from '../assets/images/logo.jpg';
|
||||||
import MarkdownRender from '../components/MarkdownRender';
|
import MarkdownRender from '../components/MarkdownRender';
|
||||||
import { ToolTipButton } from '../components/ToolTipButton';
|
import { ToolTipButton } from '../components/ToolTipButton';
|
||||||
import { ArrowCircleUp28Regular, Delete28Regular, RecordStop28Regular } from '@fluentui/react-icons';
|
import { ArrowCircleUp28Regular, Delete28Regular, RecordStop28Regular } from '@fluentui/react-icons';
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ import {
|
|||||||
Label,
|
Label,
|
||||||
Option,
|
Option,
|
||||||
Select,
|
Select,
|
||||||
Switch
|
Switch,
|
||||||
|
Text
|
||||||
} from '@fluentui/react-components';
|
} from '@fluentui/react-components';
|
||||||
import {
|
import {
|
||||||
AddCircle20Regular,
|
AddCircle20Regular,
|
||||||
@@ -38,6 +39,8 @@ import { ConvertModel, FileExists } from '../../wailsjs/go/backend_golang/App';
|
|||||||
import { getStrategy, refreshLocalModels } from '../utils';
|
import { getStrategy, refreshLocalModels } from '../utils';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { WindowShow } from '../../wailsjs/runtime/runtime';
|
import { WindowShow } from '../../wailsjs/runtime/runtime';
|
||||||
|
import strategyImg from '../assets/images/strategy.jpg';
|
||||||
|
import strategyZhImg from '../assets/images/strategy_zh.jpg';
|
||||||
|
|
||||||
export type ApiParameters = {
|
export type ApiParameters = {
|
||||||
apiPort: number
|
apiPort: number
|
||||||
@@ -632,6 +635,7 @@ export const Configs: FC = observer(() => {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [selectedIndex, setSelectedIndex] = React.useState(commonStore.currentModelConfigIndex);
|
const [selectedIndex, setSelectedIndex] = React.useState(commonStore.currentModelConfigIndex);
|
||||||
const [selectedConfig, setSelectedConfig] = React.useState(commonStore.modelConfigs[selectedIndex]);
|
const [selectedConfig, setSelectedConfig] = React.useState(commonStore.modelConfigs[selectedIndex]);
|
||||||
|
const [displayStrategyImg, setDisplayStrategyImg] = React.useState(false);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const port = selectedConfig.apiParameters.apiPort;
|
const port = selectedConfig.apiParameters.apiPort;
|
||||||
|
|
||||||
@@ -895,9 +899,14 @@ export const Configs: FC = observer(() => {
|
|||||||
</Dropdown>
|
</Dropdown>
|
||||||
} />
|
} />
|
||||||
}
|
}
|
||||||
{selectedConfig.modelParameters.device == 'CUDA' && <div />}
|
|
||||||
{
|
{
|
||||||
selectedConfig.modelParameters.device == 'CUDA' && <Labeled label={t('Stored Layers')}
|
selectedConfig.modelParameters.device == 'CUDA' &&
|
||||||
|
<Labeled label={t('Current Strategy')}
|
||||||
|
content={<Text> {getStrategy(selectedConfig)} </Text>} />
|
||||||
|
}
|
||||||
|
{
|
||||||
|
selectedConfig.modelParameters.device == 'CUDA' &&
|
||||||
|
<Labeled label={t('Stored Layers')}
|
||||||
desc={t('Number of the neural network layers loaded into VRAM, the more you load, the faster the speed, but it consumes more VRAM.')}
|
desc={t('Number of the neural network layers loaded into VRAM, the more you load, the faster the speed, but it consumes more VRAM.')}
|
||||||
content={
|
content={
|
||||||
<ValuedSlider value={selectedConfig.modelParameters.storedLayers} min={0}
|
<ValuedSlider value={selectedConfig.modelParameters.storedLayers} min={0}
|
||||||
@@ -922,9 +931,16 @@ export const Configs: FC = observer(() => {
|
|||||||
}} />
|
}} />
|
||||||
} />
|
} />
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
displayStrategyImg &&
|
||||||
|
<img style={{ width: '80vh', height: 'auto', zIndex: 100 }} className="fixed left-0 top-0"
|
||||||
|
src={commonStore.settings.language === 'zh' ? strategyZhImg : strategyImg} />
|
||||||
|
}
|
||||||
{
|
{
|
||||||
selectedConfig.modelParameters.device == 'Custom' &&
|
selectedConfig.modelParameters.device == 'Custom' &&
|
||||||
<Labeled label="Strategy" desc="https://github.com/BlinkDL/ChatRWKV/blob/main/ChatRWKV-strategy.png"
|
<Labeled label="Strategy"
|
||||||
|
onMouseEnter={() => setDisplayStrategyImg(true)}
|
||||||
|
onMouseLeave={() => setDisplayStrategyImg(false)}
|
||||||
content={
|
content={
|
||||||
<Input className="grow" placeholder="cuda:0 fp16 *20 -> cuda:1 fp16"
|
<Input className="grow" placeholder="cuda:0 fp16 *20 -> cuda:1 fp16"
|
||||||
value={selectedConfig.modelParameters.customStrategy}
|
value={selectedConfig.modelParameters.customStrategy}
|
||||||
|
|||||||
Reference in New Issue
Block a user