How to load locally saved author photos based on author ID

One option is to use the pre_get_avatar filter to return custom avatar HTML, which will short-circuit get_avatar() preventing it from reaching out to Gravatar for the image.

For example like this,

add_filter('pre_get_avatar', 'wpse_410434_author_img_html', 10, 3);
function wpse_410434_author_img_html( $avatar, $id_or_email, $args ) {
  if ( $avatar || ! is_numeric( $id_or_email ) ) {
    return $avatar;

  $upload_dir = wp_upload_dir();
  return sprintf(
    '<img class="my-author-avatar" src="%1$s" alt="" width="%2$d" height="%2$d">',
      absint( $id_or_email )
    esc_attr( $args['size'] )

N.B Untested, but should work. Tweak to match your exact setup and needs.