Spaces:
Running
on
T4
Running
on
T4
fixes for new dockerfile
Browse files- .dockerignore +1 -0
- .gitattributes +1 -0
- .gitignore +3 -0
- Dockerfile +51 -23
- README.md +1 -1
- seamless_server/app_pubsub.py +13 -1
- seamless_server/requirements.txt +7 -2
- seamless_server/whl/seamless_communication-1.0.0-py3-none-any.whl +3 -0
- streaming-react-app/src/SocketWrapper.tsx +4 -2
- streaming-react-app/vite.config.ts +11 -3
.dockerignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
seamless_server/models/*.pt
|
.gitattributes
CHANGED
@@ -34,3 +34,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
*.mp3 filter=lfs diff=lfs merge=lfs -text
|
|
|
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
*.mp3 filter=lfs diff=lfs merge=lfs -text
|
37 |
+
*.whl filter=lfs diff=lfs merge=lfs -text
|
.gitignore
CHANGED
@@ -1,2 +1,5 @@
|
|
1 |
.vscode/settings.json
|
2 |
__pycache__/
|
|
|
|
|
|
|
|
1 |
.vscode/settings.json
|
2 |
__pycache__/
|
3 |
+
*.pt
|
4 |
+
*.model
|
5 |
+
venv/
|
Dockerfile
CHANGED
@@ -1,7 +1,25 @@
|
|
1 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
FROM nvidia/cuda:11.7.1-cudnn8-devel-ubuntu22.04
|
4 |
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
|
5 |
RUN apt-get update && \
|
6 |
apt-get upgrade -y && \
|
7 |
apt-get install -y --no-install-recommends \
|
@@ -23,6 +41,7 @@ RUN apt-get update && \
|
|
23 |
libxmlsec1-dev \
|
24 |
libffi-dev \
|
25 |
liblzma-dev \
|
|
|
26 |
# gradio dependencies \
|
27 |
ffmpeg \
|
28 |
# fairseq2 dependencies \
|
@@ -33,30 +52,39 @@ RUN apt-get update && \
|
|
33 |
RUN useradd -m -u 1000 user
|
34 |
USER user
|
35 |
ENV HOME=/home/user \
|
36 |
-
PATH=/home/user/.local/bin:$
|
37 |
-
WORKDIR $
|
38 |
|
39 |
RUN curl https://pyenv.run | bash
|
40 |
-
ENV PATH=$
|
41 |
ARG PYTHON_VERSION=3.10.12
|
42 |
-
RUN pyenv install $
|
43 |
-
pyenv global $
|
44 |
pyenv rehash && \
|
45 |
pip install --no-cache-dir -U pip setuptools wheel
|
46 |
|
47 |
-
COPY --chown=
|
48 |
-
|
49 |
-
|
50 |
-
COPY --
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# build frontend with node
|
2 |
+
FROM node:20-alpine AS frontend
|
3 |
+
RUN apk add --no-cache libc6-compat
|
4 |
+
WORKDIR /app
|
5 |
+
|
6 |
+
COPY streaming-react-app .
|
7 |
+
RUN \
|
8 |
+
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
9 |
+
elif [ -f package-lock.json ]; then npm ci; \
|
10 |
+
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
|
11 |
+
else echo "Lockfile not found." && exit 1; \
|
12 |
+
fi
|
13 |
+
|
14 |
+
RUN npm run build
|
15 |
+
|
16 |
+
# build backend on CUDA
|
17 |
+
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 AS backend
|
18 |
+
WORKDIR /app
|
19 |
|
|
|
20 |
ENV DEBIAN_FRONTEND=noninteractive
|
21 |
+
ENV NODE_MAJOR=20
|
22 |
+
|
23 |
RUN apt-get update && \
|
24 |
apt-get upgrade -y && \
|
25 |
apt-get install -y --no-install-recommends \
|
|
|
41 |
libxmlsec1-dev \
|
42 |
libffi-dev \
|
43 |
liblzma-dev \
|
44 |
+
sox libsox-fmt-all \
|
45 |
# gradio dependencies \
|
46 |
ffmpeg \
|
47 |
# fairseq2 dependencies \
|
|
|
52 |
RUN useradd -m -u 1000 user
|
53 |
USER user
|
54 |
ENV HOME=/home/user \
|
55 |
+
PATH=/home/user/.local/bin:$PATH
|
56 |
+
WORKDIR $HOME/app
|
57 |
|
58 |
RUN curl https://pyenv.run | bash
|
59 |
+
ENV PATH=$HOME/.pyenv/shims:$HOME/.pyenv/bin:$PATH
|
60 |
ARG PYTHON_VERSION=3.10.12
|
61 |
+
RUN pyenv install $PYTHON_VERSION && \
|
62 |
+
pyenv global $PYTHON_VERSION && \
|
63 |
pyenv rehash && \
|
64 |
pip install --no-cache-dir -U pip setuptools wheel
|
65 |
|
66 |
+
COPY --chown=user:user ./seamless_server ./seamless_server
|
67 |
+
# change dir since pip needs to seed whl folder
|
68 |
+
RUN cd seamless_server && pip install --no-cache-dir --upgrade -r requirements.txt
|
69 |
+
COPY --from=frontend /app/dist ./streaming-react-app/dist
|
70 |
+
|
71 |
+
WORKDIR $HOME/app/seamless_server
|
72 |
+
# temporary hack to link SeamlessStreaming models
|
73 |
+
ARG HF_TOKEN
|
74 |
+
RUN huggingface-cli download meta-private/SeamlessStreaming seamless_streaming_unity.pt spm_char_lang38_tc.model seamless_streaming_monotonic_decoder.pt --local-dir ./models/ && \
|
75 |
+
huggingface-cli download meta-private/SeamlessExpressive pretssel_melhifigan_wm-final.pt --local-dir ./models/
|
76 |
+
USER root
|
77 |
+
RUN mkdir -p /large_experiments/seamless/ust/krs/fairseq2_checkpoints/ && \
|
78 |
+
mkdir -p /large_experiments/seamless/workstream/expressivity/oss/checkpoints/ && \
|
79 |
+
mkdir -p /checkpoint/krs/unity2/ && \
|
80 |
+
chown -R user:user /large_experiments/ && \
|
81 |
+
chown -R user:user /checkpoint/ && \
|
82 |
+
ln -s $(readlink -f models/seamless_streaming_unity.pt) /large_experiments/seamless/ust/krs/fairseq2_checkpoints/seamless_streaming_unity.pt && \
|
83 |
+
ln -s $(readlink -f models/seamless_streaming_monotonic_decoder.pt) /large_experiments/seamless/ust/krs/fairseq2_checkpoints/seamless_streaming_monotonic_decoder.pt && \
|
84 |
+
ln -s $(readlink -f models/pretssel_melhifigan_wm-final.pt) /large_experiments/seamless/workstream/expressivity/oss/checkpoints/pretssel_melhifigan_wm-final.pt && \
|
85 |
+
ln -s $(readlink -f models/spm_char_lang38_tc.model) /checkpoint/krs/unity2/
|
86 |
+
|
87 |
+
USER user
|
88 |
+
CMD [ "uvicorn", "app_pubsub:app", "--host", "0.0.0.0", "--port", "7860" ]
|
89 |
+
|
90 |
+
|
README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
---
|
2 |
-
title: Seamless
|
3 |
emoji: 📞
|
4 |
colorFrom: blue
|
5 |
colorTo: yellow
|
|
|
1 |
---
|
2 |
+
title: Seamless Streaming Backend/Frontend
|
3 |
emoji: 📞
|
4 |
colorFrom: blue
|
5 |
colorTo: yellow
|
seamless_server/app_pubsub.py
CHANGED
@@ -12,6 +12,10 @@ import sys
|
|
12 |
import time
|
13 |
import random
|
14 |
import string
|
|
|
|
|
|
|
|
|
15 |
|
16 |
from src.room import Room, Member
|
17 |
from src.simuleval_agent_directory import NoAvailableAgentException
|
@@ -86,7 +90,15 @@ sio = socketio.AsyncServer(
|
|
86 |
# engineio_logger=logger,
|
87 |
)
|
88 |
# sio.logger.setLevel(logging.DEBUG)
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
|
91 |
# rooms is indexed by room_id
|
92 |
rooms: Dict[str, Room] = {}
|
|
|
12 |
import time
|
13 |
import random
|
14 |
import string
|
15 |
+
from starlette.applications import Starlette
|
16 |
+
from starlette.routing import Mount, Route
|
17 |
+
from starlette.staticfiles import StaticFiles
|
18 |
+
|
19 |
|
20 |
from src.room import Room, Member
|
21 |
from src.simuleval_agent_directory import NoAvailableAgentException
|
|
|
90 |
# engineio_logger=logger,
|
91 |
)
|
92 |
# sio.logger.setLevel(logging.DEBUG)
|
93 |
+
socketio_app = socketio.ASGIApp(sio)
|
94 |
+
|
95 |
+
app_routes = [
|
96 |
+
Mount("/ws", app=socketio_app), # Mount Socket.IO server under /app
|
97 |
+
Mount(
|
98 |
+
"/", app=StaticFiles(directory=CLIENT_BUILD_PATH, html=True)
|
99 |
+
), # Serve static files from root
|
100 |
+
]
|
101 |
+
app = Starlette(debug=True, routes=app_routes)
|
102 |
|
103 |
# rooms is indexed by room_id
|
104 |
rooms: Dict[str, Room] = {}
|
seamless_server/requirements.txt
CHANGED
@@ -1,5 +1,7 @@
|
|
1 |
-
|
|
|
2 |
# seamless_communication
|
|
|
3 |
Flask==2.1.3
|
4 |
Flask_Sockets==0.2.1
|
5 |
g2p_en==2.1.0
|
@@ -12,7 +14,7 @@ protobuf==4.24.2
|
|
12 |
psola==0.0.1
|
13 |
pydub==0.25.1
|
14 |
silero==0.4.1
|
15 |
-
simuleval==1.1.1
|
16 |
soundfile==0.11.0
|
17 |
stable_ts==1.4.0
|
18 |
torch # specific torch version depends on fairseq2 installation
|
@@ -23,3 +25,6 @@ python-socketio==5.9.0
|
|
23 |
uvicorn[standard]==0.23.2
|
24 |
parallel-wavegan==0.5.5
|
25 |
python-jose[cryptography]==3.3.0
|
|
|
|
|
|
|
|
1 |
+
--pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/nightly/pt2.1.1/cu118
|
2 |
+
git+https://github.com/facebookresearch/SimulEval.git
|
3 |
# seamless_communication
|
4 |
+
./whl/seamless_communication-1.0.0-py3-none-any.whl
|
5 |
Flask==2.1.3
|
6 |
Flask_Sockets==0.2.1
|
7 |
g2p_en==2.1.0
|
|
|
14 |
psola==0.0.1
|
15 |
pydub==0.25.1
|
16 |
silero==0.4.1
|
17 |
+
# simuleval==1.1.1
|
18 |
soundfile==0.11.0
|
19 |
stable_ts==1.4.0
|
20 |
torch # specific torch version depends on fairseq2 installation
|
|
|
25 |
uvicorn[standard]==0.23.2
|
26 |
parallel-wavegan==0.5.5
|
27 |
python-jose[cryptography]==3.3.0
|
28 |
+
starlette==0.32.0.post1
|
29 |
+
hf_transfer==0.1.4
|
30 |
+
huggingface_hub==0.19.4
|
seamless_server/whl/seamless_communication-1.0.0-py3-none-any.whl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c3380dc7d6613c4dc9ef4d78fd3dcf1a50f7c6a659b8ba0b37ad5237533d002e
|
3 |
+
size 234811
|
streaming-react-app/src/SocketWrapper.tsx
CHANGED
@@ -11,8 +11,9 @@ import {getURLParams} from './URLParams';
|
|
11 |
|
12 |
// The time to wait before showing a "disconnected" screen upon initial app load
|
13 |
const INITIAL_DISCONNECT_SCREEN_DELAY = 2000;
|
14 |
-
const SERVER_URL_DEFAULT = "
|
15 |
-
|
|
|
16 |
export default function SocketWrapper({children}) {
|
17 |
const [socket, setSocket] = useState<Socket | null>(null);
|
18 |
const [connected, setConnected] = useState<boolean | null>(null);
|
@@ -63,6 +64,7 @@ export default function SocketWrapper({children}) {
|
|
63 |
// want that because that'd mean awful performance. It'd be better for the app
|
64 |
// to simply break in that case and not connect.
|
65 |
transports: ['websocket'],
|
|
|
66 |
});
|
67 |
|
68 |
const onServerID = (serverID: string) => {
|
|
|
11 |
|
12 |
// The time to wait before showing a "disconnected" screen upon initial app load
|
13 |
const INITIAL_DISCONNECT_SCREEN_DELAY = 2000;
|
14 |
+
const SERVER_URL_DEFAULT = `${window.location.protocol === "https:" ? "wss" : "ws"
|
15 |
+
}://${window.location.host}`;
|
16 |
+
|
17 |
export default function SocketWrapper({children}) {
|
18 |
const [socket, setSocket] = useState<Socket | null>(null);
|
19 |
const [connected, setConnected] = useState<boolean | null>(null);
|
|
|
64 |
// want that because that'd mean awful performance. It'd be better for the app
|
65 |
// to simply break in that case and not connect.
|
66 |
transports: ['websocket'],
|
67 |
+
path: '/ws/socket.io'
|
68 |
});
|
69 |
|
70 |
const onServerID = (serverID: string) => {
|
streaming-react-app/vite.config.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
import {defineConfig} from 'vite';
|
2 |
import react from '@vitejs/plugin-react';
|
3 |
// import {resolve} from 'path';
|
4 |
|
@@ -7,10 +7,18 @@ import react from '@vitejs/plugin-react';
|
|
7 |
// const typesDir = resolve(__dirname, 'types');
|
8 |
|
9 |
// https://vitejs.dev/config/
|
10 |
-
export default defineConfig(({command}) => {
|
11 |
let define = {};
|
12 |
return {
|
13 |
plugins: [react()],
|
14 |
define: define,
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
});
|
|
|
1 |
+
import { defineConfig } from 'vite';
|
2 |
import react from '@vitejs/plugin-react';
|
3 |
// import {resolve} from 'path';
|
4 |
|
|
|
7 |
// const typesDir = resolve(__dirname, 'types');
|
8 |
|
9 |
// https://vitejs.dev/config/
|
10 |
+
export default defineConfig(({ command }) => {
|
11 |
let define = {};
|
12 |
return {
|
13 |
plugins: [react()],
|
14 |
define: define,
|
15 |
+
server: {
|
16 |
+
proxy: {
|
17 |
+
'/ws': {
|
18 |
+
target: 'ws://localhost:7860',
|
19 |
+
ws: true
|
20 |
+
}
|
21 |
+
},
|
22 |
+
},
|
23 |
+
}
|
24 |
});
|