0

My deployed Flask web app keeps throwing “Error: Server Error The server encountered an error and could not complete your request. Please try again in 30 seconds”. However, I can’t find any error in the logs:

2022-05-30 00:35:40 default[20220529t172208]  [2022-05-30 00:35:40 +0000] [10] [INFO] Starting gunicorn 20.1.0
2022-05-30 00:35:40 default[20220529t172208]  [2022-05-30 00:35:40 +0000] [10] [INFO] Listening at: http://0.0.0.0:8081 (10)
2022-05-30 00:35:40 default[20220529t172208]  [2022-05-30 00:35:40 +0000] [10] [INFO] Using worker: sync
2022-05-30 00:35:40 default[20220529t172208]  [2022-05-30 00:35:40 +0000] [15] [INFO] Booting worker with pid: 15
2022-05-30 00:35:42 default[20220529t172208]  2022-05-30 00:35:42.693664: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /layers/google.python.pip/pip/lib
2022-05-30 00:35:42 default[20220529t172208]  2022-05-30 00:35:42.694475: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2022-05-30 00:35:44 default[20220529t172208]  [2022-05-30 00:35:44 +0000] [10] [INFO] Handling signal: term

There is a Tensorflow warning but it is not an error (see Could not load dynamic library 'cudart64_101.dll' on tensorflow CPU-only installation ). The application errors and server errors in the App Engine Dashboard aren't very helpful either.

Here are the content of my files:

main.py:

from flask import Flask,render_template,request,escape,send_from_directory,send_file #send_file,send_from_directory
import youtube_dl
import lyricsgenius as lg
import os
from spleeter.separator import Separator
from dotenv import load_dotenv

api_key = os.environ.get('GENIUS_API_KEY', 'default value')
genius = lg.Genius(api_key)

app = Flask(__name__)


@app.route("/", methods=['GET'])
def index():
    yt_url = request.args.get("yt_url","")
    artist = request.args.get("artist","")
    song = request.args.get("song","")
    split_audio_tag=""

    if yt_url:
        split_audio_tag = youtube_to_split_audio(yt_url)
        print('split audio tag:',split_audio_tag)

    if artist and song:
        lyrics = getlyrics(artist,song) ###

    else:
        lyrics = ""

    return ("""<form action="" method="get">
                Artist: <input type="text" name="artist">
                Song: <input type="text" name="song">
                YouTube URL: <input type="text" name="yt_url">
                <input type="submit" value="Go">
              </form>"""+"Lyrics: "+lyrics+split_audio_tag) 


def getlyrics(artist,song):
    try:
        artist = genius.search_artist(artist, max_songs=1)
        song = artist.song(song)
        return song.lyrics
    except:
        return "invalid input"


def youtube_to_split_audio(yt_url):
    # video_url = input("please enter youtube video url:")
    video_info = youtube_dl.YoutubeDL().extract_info(
        url = yt_url,download=False
        )
    filename = f"{video_info['title']}.mp3"
    options={
        'format': 'bestaudio/best',
        # 'quality': 7,
        'keepvideo':False,
        'outtmpl':'./static/yt_mp3/'+filename,
    }

    with youtube_dl.YoutubeDL(options) as ydl:
        ydl.download([video_info['webpage_url']])

    def split_vocals(mp3):
        separator = Separator('spleeter:2stems')
        separator.separate_to_file('./static/yt_mp3/'+mp3,
                                    './static/split_audio/'+mp3)
    split_vocals(filename)

   
    filepath = './static/split_audio/'+filename+'/'+filename[:-4]+'/accompaniment.wav'
    global split_audio_tag
    split_audio_tag = '<audio controls> <source src="'+filepath+'" type="audio/wav"> </audio>'
    print('audio tag:',split_audio_tag)
    return split_audio_tag



if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8080, debug=True)

requirements.txt

click==7.1.2
Flask==2.0.3
youtube_dl
lyricsgenius
numpy==1.19.2
numba==0.53.0
protobuf==3.20.1
spleeter
python-dotenv
gunicorn

app.yaml

runtime: python38
entrypoint: gunicorn -b :$PORT main:app

env_variables:
  GENIUS_API_KEY: "xxxxxxxxxxxx"

What might be causing the server error?

  • You've probably run out of memory. Try maxing that out. Though GAE doesn't offer a lot of memory so the max might still not be enough. – new name May 30 '22 at 13:05

1 Answers1

0

I tried to reproduce your code (difference is that I used Python 3.9 but your app.yaml says Python 3.8).

I get the following error

Cannot install -r requirements.txt (line 6), -r requirements.txt (line 8) and numpy==1.19.2 because these package versions have conflicting dependencies.

stdout: 
The conflict is caused by:
    The user requested numpy==1.19.2
    numba 0.53.0 depends on numpy>=1.15
    spleeter 2.1.0 depends on numpy<1.19.0 and >=1.16.0

This might be the issue i.e. GAE production did not successfully install your requirements.

Are you able to execute your code on your local machine (i.e. create a virtual env, install your requirements.txt file and then run your code)?

NoCommandLine
  • 5,044
  • 2
  • 4
  • 15